18
sakamoto.kazuki @splhack
autorelease って何が起きるの? 解答例→ http://bit.ly/guOjkV http://bit.ly/fIqS1X 根元のNSObjectのautoreleaseメソッドが、NSAutoreleasePoolのaddObjectメソッドを呼ぶだけ。
sakamoto.kazuki @splhack
NSAutoreleasePoolのdrainかreleaseで、addObjectされてたすべてのオブジェクトにreleaseを送るだけ。
sakamoto.kazuki @splhack
NSAutoreleasePoolがdrainかreleaseされるタイミングは? NSRunLoopが1回回るたび。自力で作ってdrainかreleaseするとき。
sakamoto.kazuki @splhack
NSRunLoop runMode:beforeDate: の最後。このメソッドの最初でallocしたNSAutoreleasePoolをreleaseしてます。runUntilDate:でぐるぐるとrunMode:beforeDate:が呼ばれます。
sakamoto.kazuki @splhack
GNUstepのNSRunLoopの実装はこれ http://bit.ly/f8tlCY で、今回あくまでGNUstepの実装を元にしているので、多少異なるかもしれませんが、基本的には同じはず。GCDの方はlibdispatchなのでiOSでも一緒。
sakamoto.kazuki @splhack
ので多量のautoreleaseされるオブジェクトを使う場合、つまり、autoreleaseを呼んだり、オブジェクトを返すクラスメソッドを呼んだり(NSString string*)、する場合は自力でNSAutoreleasePool allocしてdrainすべし。
sakamoto.kazuki @splhack
たとえば、たくさん画像を読み込む場合。ファイルを読み込んだNSDataオブジェクト。それから作ったUIImageオブジェクト。サイズを変更したりしてまたUIImageオブジェクト。てな時にautoreleaseしただけのオブジェクトが大量に残る。
sakamoto.kazuki @splhack
for() {NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; /* 画像読み込み処理 */; [pool drain];} これでスッキリ。
sakamoto.kazuki @splhack
releaseじゃなくてdrainを呼ぶ理由は、Mac OS XでGC活かしているときGC走るから。
sakamoto.kazuki @splhack
Grand Central DispatchではNSAutoreleasePoolはどーなってるの? Main QueueはメインスレッドのRunLoopの話と同じ。Global Queue/Serial Queueは、threadの生成時にpool生成、終了時にpool解放。
sakamoto.kazuki @splhack
GCD Global Queue/Serial QueueでのNSAutoreleasePoolのreleaseは、もっと細かいか。QueueにいれたBlockまたは関数ポインタ毎か。
sakamoto.kazuki @splhack
Grand Central DispatchのGlobal/Serial Queueで動くthreadから呼ばれる http://bit.ly/eZ6ORX _dispatch_worker_thread2で、Block実行前にpool alloc、実行後pool release
唎酒師スミヒロ🍶 @sumihiro
つーこたiOS下で回数がすげー大きいループで毎回autoreleaseしてたらdrainされる前にメモリを食いつぶすんかな。
唎酒師スミヒロ🍶 @sumihiro
@sakira おー、やっぱそーゆーことなんですね。
さきさきびより @sakira
@sumihiro 数百回のloopの中でUIColorをautoreleaseしたらやられちゃったので、明示的にinitWith..., releaseで対応した感じです。
唎酒師スミヒロ🍶 @sumihiro
@sakira ほほう。てことはクラスメソッドも使えない感じで?もしそうであれば面倒な話ですなぁ。
さきさきびより @sakira
@sumihiro なかったですね〜。というか計算式わかっているので、本来ならUIColorなんか使わないで自分で書くとこですが、本の解説用のコードだったので。
唎酒師スミヒロ🍶 @sumihiro
@sakira UIColor自体はメモリ消費量は少なそうですが、注意が必要なんですな。どもどもー。
唎酒師スミヒロ🍶 @sumihiro
やっぱり大量のメモリ消費が見込まれる場合はautoreleaseに頼るな、と。少なからず自分の体感が合ってて安心した。
sakamoto.kazuki @splhack
え、クラスメソッドしかないよ! て時は、alloc,init,releaseをあきらめて、NSAutoreleasePool作りましょう。
sakamoto.kazuki @splhack
"生成時に autorelease するのが望ましい" http://bit.ly/hsgwg7
Hiroshi Hashiguchi @xcatsan
nonatomic無しだと参照だけで retain count が増加する件 >> Objective-Cの宣言プロパティにはまる - Basic http://bit.ly/hMsOqK
残りを読む(2)

コメント

sakamoto.kazuki @splhack 2011年1月13日
蛇足じゃなくて補足
sakamoto.kazuki @splhack 2011年1月13日
実体験も追加しちゃうよ!
sakamoto.kazuki @splhack 2011年1月13日
Google様のおっしゃることも追加してみた。 "Google Objective-Cスタイルガイド 日本語訳"
sakamoto.kazuki @splhack 2011年1月14日
autorelease図解したよ!
sakamoto.kazuki @splhack 2011年1月20日
最近見かけたautorelease絡みのtweetを収集
ログインして広告を非表示にする
ログインして広告を非表示にする