ときに自動解放は、実際にココアタッチでの放出を引き起こすのでしょうか?
-
21-08-2019 - |
質問
私はあなたがiOSのautorelease
と注意する必要があります理解しています。私はそれが呼び出し側で必要とされるalloc
sオブジェクトを返すメソッドを持っているので、このような状況では - 私はそれを理解して - 私はそれが戻る前に呼び出し先のオブジェクトにautorelease
を送信する必要があります。
これは結構ですが、(私のボタンのクリックが処理された後、すなわち)電話に制御が戻るたら、自動解放プールが解放されているようです。私は、これは可能になっているかである疑いがあるが、私はこのような状況のためのベストプラクティスは何か疑問に思ってます。
私は、オブジェクトが解放されないように、発信者からretain
メッセージを送信して、明示的dealloc
でそれを解放するに頼っています。
これが最善のアプローチですか?
解決
自動解放プールは通常、実行ループの各反復後に放出されます。大雑把に、すべてのココアとココアタッチアプリケーションはこのように構成されます:
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
あなたが記述することは予想される動作です。あなたはもはやそれよりも周りのオブジェクトを保持したい場合は、明示的にそれを保持する必要があります。
他のヒント
autorelease
を使用すると、「私はもうあなたを望んでいないが、私はあなたが欲しいかもしれませんので、まだ消えていない他の誰かにあなたを渡すつもりですオブジェクト。」、というのが方法ですだから、オブジェクトは、十分な長さあなたがメソッドからそれを返したり、別のオブジェクトにそれを与えるためには周りに固執します。いくつかのコードは、周りのオブジェクトを保持したい場合は、それをretain
ingことにより、所有権を主張する必要があります。
メモリ管理ガイドラインが必要にすべてのためを参照してください。正しくautorelease
を使用することを知っています。
ここでは、Appleのメモリー管理ドキュメント
はい、それが最善のアプローチです。自動解放は、実際には、あなたが知っているコード内の相互作用を対象としています。あなたがオブジェクトを格納したら、あなたはまた、オブジェクトに終わっまで死なないの参照を保持しているオブジェクトは、/スコープの外に出ることを知っている必要がありいずれか、またはあなたがオブジェクトを保持する必要があります。
唯一の自動解放オブジェクトは、あなたの方法の終了後にリリースされることが保証されます。結局のところ、あなたのメソッドを呼び出したメソッドは、独自のプールを作成している可能性があり、右のあなたの方法の後にそれを解放します。