2011-01-16 7 views
0

オートレリースされたオブジェクトを保持するとどうなりますか? リリースされるのか、それとも勝ち残りますか?iPhone - オートリリース後に保持するとどうなりますか?

+2

最も簡単な方法は、試してみることです。コードを修正し、ビルドして実行します。あなたの所見を教えてください。 %) –

答えて

7

知っていますか? がリリースされるのか、それとも勝利は勝ちますか?

retain「勝ち」とは思っていますが、そのように考えるのは失敗です。

retainおよびreleaseは、オブジェクトの保持カウントを増減するためのメカニズムに過ぎません。自動解放は単に遅延リリースです。もはや、それほどではありません。

オートレリースオブジェクトを保持している場合は、保持カウントを現在増加させていますが、保持カウントは後で減少します。これはいつも起こります。 [NSString stringWithFormat: @"...."]は、自動ループした文字列を返します。これは、イベントループの現在のパスを超えてスクロールしたい場合はretainです。

2

変数を保持したい場合は、にはが必要です。たとえば:

myButton = [[UIButton buttonWithType:...] retain]; 

buttonWithType:方法はautoreleaseでインスタンス化されていますUIButtonを返します。それは、必要なときにそれ自体を解放する(話すように)世話をするでしょう。

2

リテールが勝ちます。これは非常に一般的であり、例外的な習慣です。

通常の便利なメソッドが

[NSString stringWithFormat:@""]; 

などの自動解放オブジェクトを返すあまりにも長い間、あなたが後でそれらを解放することを忘れないように、あなたはあなたがする必要があるものは何でもオブジェクト保持することが期待されています。

現在のシステムメッセージの最後に自動リースが行われることに注意してください。

以下の記事から: "システムによって処理されるメッセージごとに自動解放プールが作成され、そのメッセージの処理が完了した後、プール内のオブジェクトはすべて自動的に解放されます。

本のいくつかの偉大な説明はここで見つけることができます:あなたは、私は自動解放オブジェクト を保持している場合、何が起こるか

http://www.iphonedevsdk.com/forum/iphone-sdk-tutorials/7295-getters-setters-properties-newbie.html

+0

autoreleaseが現在の方法の終わりに(必然的に)起こるわけではないことを除いて、かなり良い答えです。オートレリースされたオブジェクトは、プールが排水されたときにのみ解放され、通常は実行ループを通るたびに1回しか発生しません。オートレリースされたオブジェクトは、長時間張り付く可能性があります。 – kubi

+0

@ kubi:記事iから、 "システムで処理されるメッセージごとに自動解放プールが作成され、プール内のオブジェクトはすべて、そのメッセージの処理が完了した後に自動的に解放されます。私は現在のメッセージを意味しませんでした、私は現在のシステムメッセージを意味しました。私は私のポストを修正します。 –

+0

「現在のシステムメッセージ」は概念的には正しいですが、より正確な用語は「現在のイベント」です。通常は「現在のイベントは実行ループによって処理されています。GCDキューは、キューごとに自動解放プールも管理することがあります(場合によってはそれ以上の場合もあります)。ただし、排出量は実行ループよりもはるかに決定的ではありません。 – bbum

関連する問題