2010-11-23 3 views
1

私はhereの前に、同様の質問が答えられていることを知っていますが、ちょっとだけ分かりました。ここに私のシナリオです...アイホンメモリ管理(autorelease)の明確化

私は、以下に示すように、割り当てられたUIImageViewを返すヘルパークラスメソッドを持っています。

私はそのように使用しています私のUIViewControllerの方法のいずれかで、その後
+(UIImageView *)tableCellButton{ 
return [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]] autorelease]; 

}

..

UIImageView *imageView = [Helper tableCellButton]; 
imageView.frame = cell.backgroundView.bounds; 
imageView.tag = 250; 
[cell.backgroundView addSubview:imageView]; 

私の質問は、このメモリが解放される方法に関してです。私はautoreleaseプール(アプリケーションを作成したもの以外)を使用していないので、変数はiVar/Propertyではありません(したがって、deallocが呼び出されると解放されません)。この場合、私はそれを呼び出した後でメモリを解放する責任がありますか?オートレリーズはいつ始まりますか?助けてくれてありがとう!

+1

はとき[AutoreleasePoolリリース](http://stackoverflow.com/questions/581828/autorelease-scope)については、ここでこの質問を参照してください。うまくいけばそれはあなたにいくつかの洞察を与えるでしょう。ボタンを押している間に作成された場合、または 'cell.backgroundView'が存続している限り(' addSubview 'retains。) –

+0

リリースで...私のアプリケーションの唯一の自動解放プールはmainにあるものです。その場合、リークが発生するのですか、ViewControllerがテーブルとセルをクリーンアップすると、そのオブジェクトはリリースを送信されますか? – DerekH

+0

あなたの返答をありがとう!私もiOS用のメモリ管理ドキュメントを見つけました(私が以前にどのように見逃していたかわかりません)。 http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html#//apple_ref/doc/uid/10000011-SW1 – DerekH

答えて

1

autoreleaseを呼び出すと、次にイベントループでreleaseがオブジェクトに送信されます。これはtableCellButtonで行われたallocコールの原因となります。オブジェクトが保持される唯一の他の時間はaddSubviewの内部であり、同じオブジェクトのそれ自身のreleaseも処理する。上記のコードに基づいて、このオブジェクトのメモリ管理がチェックアウトされます。

1

runloopの各繰り返しには、独自の自動解放プールがあります。基本的に

、このようにそれを考える:

while(1) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    [someObject doSomething]; 
    [pool drain]; 
} 
+0

アプリケーションが実行されているときに、自動解放プールが作成されている各イベントごとに、またはメインにグローバルなイベントが1つだけありますか? – DerekH

+1

すべてのイベント。つまり、イベントが完了すると、自動解放プールが排水され、新しいプールが作成されます。メインに自動解放プールがありますが、それは基本的にプログラムが終了する前の最後のキャッチオールです。 –