11

iOSではautoreleaseに注意してください。私はオブジェクトを返しているメソッドを持っています。これは呼び出し側が必要とするものです。このような状況では、私が理解しているように、呼び出し先のオブジェクトにautoreleaseを返す必要があります。autoreleaseはいつ実際にCocoa Touchでリリースされますか?

これは問題ありませんが、コントロールが電話に戻ったら(つまり、ボタンのクリックが処理された後)、自動解放プールが解放されたようです。私はこれがどのようになっているのだろうと思っていますが、私はこの状況のベストプラクティスが何であるか疑問に思っています。

私はretainメッセージを発信者から送信して、オブジェクトが解放されないようにしてから、それをdeallocに明示的に解放しました。

これが最善のアプローチですか?

答えて

21

自動解放プールは、通常、実行ループが繰り返されるたびに解放されます。大雑把に、すべてのココアとココアタッチアプリケーションは次のように構成されています

Get the next message out of the queue 
Create an autorelease pool 
Dispatch the message (this is where your application does its work) 
Drain the autorelease pool 

は何を記述することは期待される動作です。オブジェクトをそれより長く保持したい場合は、オブジェクトを明示的に保持する必要があります。

2

はい、これが最良の方法です。 Autoreleaseは実際にあなたが知っているコード内の対話を意図したものです。オブジェクトを格納したら、参照を保持しているオブジェクトは、そのオブジェクトで処理が完了するまで、またはそのオブジェクトを保持する必要があるまで、スコープから外れたり外に出たりしません。

1

自動解放されたオブジェクトは、メソッドの終了後に解放されることが保証されています。結局のところ、メソッドを呼び出したメソッドは独自のプールを作成し、メソッドの直後に解放することができました。

+0

あなたが別の方法でプールを、一つの方法でプールを作成し、いくつかのオブジェクトを自動解放し、ドレイン可能性があるので、でもそれは、保証されません。ここで –

13

autoreleaseを使用すると、「オブジェクト、私はもうあなたを望んでいませんが、あなたを欲しいかもしれない他の人にあなたを渡すつもりです。したがって、オブジェクトは、メソッドから戻すか、別のオブジェクトに渡すのに十分な長さに留まります。オブジェクトを保持したいコードがある場合は、retainで所有権を主張する必要があります。

autoreleaseを正しく使用するために知っておくべきことは、the memory management guidelinesを参照してください。厳密に言えば

– (id)findMatchingObject:(id)anObject 
{ 
    id match = nil; 
    while (match == nil) { 
     NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init]; 
     /* Do a search that creates a lot of temporary objects. */ 
     match = [self expensiveSearchForObject:anObject]; 
     if (match != nil) { 
      [match retain]; /* Keep match around. */ 
     } 
     [subPool release]; 
    } 
    return [match autorelease]; /* Let match go and return it. */ 
} 
+0

ええええええええええええええええええええと、このsafe__?あなたがオブジェクトを返すときの例はありますか?しかし、あなたはそれを使う機会がある前にオブジェクトが消えてしまいますか? – bobobobo

+0

@bobobobo:あなたがメモリ管理ルールを守っているわけではありません。 'autorelease'の動作はかなり予測可能です。オブジェクトは、現在の自動解放プールがなくなるまで(現在のイベントループが終了するまでは発生しません。たとえば、インスタンス変数をオブジェクトにポイントし、オブジェクト変数を保持せずに後でアクセスしようとすると、オブジェクトを使用する前にオブジェクトが消えてしまいます。これは、メモリ管理を壊したためですオブジェクトを保持していないときは契約していました。 – Chuck

3

the Apple Memory Management documentで提供examleあります。疑わしいデザインですが、有効です。オブジェクトは、プールを作成する方法に関係なく、プールの作成からプールの排水まで、すべての方法で持続します。
関連する問題