2010年5月11日火曜日

iPhone開発でメモリ使用量を把握しよう!

開発部の三森です。雨の日は室内での作業がはかどる気がします。
前回の予告通り、今回からは技術っぽい記事を書きます!

というわけで、今をときめくiPhoneの地味なメモリ管理のお話です。
iPhoneはとても贅沢にメモリを使える環境ではないので、
何にどれぐらいメモリを使っているか正確に把握したいところです。

しかし、Cocoaフレームワークのクラスはブラックボックスですし、
そもそもオブジェクトを作るのにどれぐらいメモリを使ってるのか、
調べるのも面倒なので僕は把握していませんでした。

メモリ使用量が定量的に分からないために、
どんな実装をすべきかをわりと感覚的に判断してしまっていました。。

これはいか〜ん!ということで、今回は真面目に考えてみることにします。
個々のオブジェクトがどれだけメモリーを確保するかを見てみましょう。

まず、sizeof演算子で見てみると


NSLog(@"%ld", sizeof([NSObject alloc]));


デバッガコンソールでは以下のような感じ:

2010-05-11 23:03:00.614 MemoryCheckSample[7432:207] 4


で、4バイトであることが分かります。
しかし、これはNSObjectインスタンスへのポインターのサイズなので、意味がありません。
知りたいのは確保されたオブジェクトのサイズなので、malloc_sizeを使います。
UITableViewが継承しているクラスを親から順番に見てみましょう。


NSLog(@"%ld", malloc_size([NSObject alloc]));
NSLog(@"%ld", malloc_size([UIRespondor alloc]));
NSLog(@"%ld", malloc_size([UIView alloc]));
NSLog(@"%ld", malloc_size([UIScrollView alloc]));
NSLog(@"%ld", malloc_size([UITableView alloc]));


デバッガコンソールを見ると

2010-05-11 23:09:59.353 MemoryCheckSample[7467:207] 16
2010-05-11 23:09:59.356 MemoryCheckSample[7467:207] 16
2010-05-11 23:09:59.359 MemoryCheckSample[7467:207] 48
2010-05-11 23:09:59.361 MemoryCheckSample[7467:207] 400
2010-05-11 23:09:59.367 MemoryCheckSample[7467:207] 1024


と、段々増えていっていることが分かります。
これはインスタンス用に確保したメモリーが見えています。
あとでObjective-Cのランタイムの実装ファイルを見たのですが、
オブジェクトのメモリは16バイト単位で確保されているようです。

これを見るとUITableViewに至っては1Kバイトも使われていますが、
NSObjectを沢山作る分には、メモリ的な心配はあまりなさそうです。
どちらかといえば、生成時間がかかることが問題かもしれません。

ところで、お気づきかもしれませんが、
これはまだ本当に使用したメモリーを見ているとは言えません。
なぜなら、各インスタンス変数にもオブジェクトが含まれているはずなのですが、
それらを生成するメモリ量をカウントしていないからです。例えば


[[UITableView alloc] init];


などとすると、initの中でオブジェクトが何か作られているはずですが、
malloc_sizeで見てもメモリ使用量は変わっていません。

そこで、開発部の亀田のAOP(Aspect Oriented Programming)に触発されて
NSObjectのallocを上書きするということをやってみました。
長くなってしまったので、そのお話は次回書こうと思います!

0 件のコメント:

コメントを投稿