2012年6月18日月曜日

残りメモリ容量表示



残りメモリ容量表示

メモリ使用状況はInstrumentsでチェックすることができますが、処理が重く、またiPhoneデバイス単体でのテストが行えません。そこで、残りメモリ容量を画面に表示させるクラスを作りました。UILabelなどを使って画面の空きスペースに表示させることができます。

.hファイル

#import <Foundation/Foundation.h>

@interface MemMonitor : NSObject

@property (nonatomic, readonly) long freeMemory;
@property (nonatomic, readonly) NSString *freeMemoryAsFormattedString;

@end

.mファイル
#import "MemMonitor.h"
#import <mach/mach.h>
#import <mach/mach_host.h>

@implementation MemMonitor
{
    mach_msg_type_number_t vm_info_count;
    mach_port_t mach_port;
    vm_size_t pagesize;
    NSNumberFormatter *formatter;
}
//初期化
- (id)init
{
    self = [super init];
    if (self) {
        vm_info_count = HOST_VM_INFO_COUNT;
        mach_port = mach_host_self();
        host_page_size(mach_port, &pagesize);
        formatter = [[NSNumberFormatter alloc] init];
        [formatter setPositiveFormat:@"#,##0"];
    }
    return self;
}
//メモリ残り容量をlongで返す。
- (long)freeMemory 
{
    struct vm_statistics vm_stat;
    kern_return_t ret = host_statistics(mach_port, HOST_VM_INFO, (host_info_t)&vm_stat ,&vm_info_count);
    if (ret == KERN_SUCCESS) {
        return (NSInteger)vm_stat.free_count * pagesize;
    } else {
        return -1;
    }
}
//メモリ残り容量を3桁カンマ区切りでフォーマットしたNSStringで返す。
- (NSString *)freeMemoryAsFormattedString
{
    NSNumber *num = [NSNumber numberWithInteger:self.freeMemory];
    return [formatter stringFromNumber:num];
}
@end

使用例:
UILabel *memMonitorLabel;

MemMonitor *memMonitor = [[MemMonitor alloc] init];
memMonitorLabel.text = [memMonitor freeMemoryAsFormattedString];

0 件のコメント: