酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

autoreleaseと僕とメモリ不足

Obj-Cにおけるオブジェクトの扱いは、allocだったり、retainだったり、autoreleaseだったりとややこしいですね。

NSAutoreleasePoolのリファレンスによると、メインスレッドでイベントループの最初にNSAutoreleasePoolが作られ、イベントループの最後にreleaseが送られるということらしい。なのでイベントループが一周するごとにautoreleaseされたオブジェクトは解放されることになる。

autoreleaseされたオブジェクトが解放されるタイミング | インサイドフラッギング

iPhone OS 3.xで100MBを超えたJSONファイルをパースして、SQLiteに入れる必要があります。ひとつのシーケンスの中で、autoreleaseされたオブジェクトが大量に使われており、メモリ枯渇するという問題があって昨日から頭をひねっています。

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

/* なんかautoreleaseされたオブジェクトを返す */
id hoge = [piyo func]; 
[hoge retain];
[pool release];

/* hogeを使う処理 */
[puni ugougo:hoge]; 

NSAutoreleasePoolを上記の様にネストすると、ある程度改善されたのですが、それでもあまり状況は変わらないといったところ。