2011-09-05 10 views

答えて

16

以下の回答は、ガーベジコレクションがない場合(iOSなど)です。 ガベージコレクションの場合、実際に弱い参照を作成するキーワード(__weak)があります。

「弱い」参照は、保持していない参照です。

サイクルを分割するには、これらの弱い参照を使用する必要があります。よくあるケースは、その親オブジェクトへの参照を必要とする子オブジェクトです。このシナリオでは、親オブジェクトは子オブジェクトへの参照を保持し、子オブジェクトはその親オブジェクトへの参照を保持しますが、保持しません。これは、親オブジェクトが行う限り、子オブジェクトは存在する必要があるだけなので、機能します。

弱い参照は、自動再生されたメッセージによる参照ですか。

本当に、それは、コールスタックが巻き戻されたとき

オートリリースのものは、(例えば、すべてのイベントループの最後に)消える;-)「非常に弱い参照」になりますされていません。一時的でないものが必要な場合は、参照を保持する必要があります(上記の場合と同様に、他の部分が十分に保持していることを確認してください)。

+0

私は主にiOS SDKを心配しています。 iOS 4に関しては、すべての「タイプの割り当て」プロパティを実行し、明示的な保持メッセージを持たない別のobjポインタへの他の単純な割り当ては、弱い参照とみなすべきですか? – Centurion

+1

はい。しかし、 "alloc"のようなメソッドには暗黙の "retain"が含まれていることに注意してください。 – Thilo

+0

@Thilloプロパティを使用している場合、 'weak'は' assign'と同じですか? –

6

弱参照は、強い参照がオブジェクトをメモリ内にとどまらせている間にオブジェクトをメモリ内に残すように強くないほど強い参照です。

任意の変数への弱い参照を作成した場合は、そのためにnilが返されることがあります。

UITableViewDelegate,UIScrollViewDelegateなどが弱い参照例である。強い参照の

例:ここでは

MyClass *obj1 = [[Myclass alloc] init]; 

Myclass *obj2 = obj1; 

obj2あなたは、メモリからobj1も削除されますがobj2を削除する場合obj1への強い参照を意味しています。

+1

obj2は本当にobj1への強い参照を持っていますか? 「弱い参照は、オブジェクトをメモリ内に残すよう強くない参照です」とあなたの例を見て、obj1にリリースメッセージを送信してもobj1がメモリに保持されるのを防ぐことはできません。 Myclass * obj2 = obj1; " obj1の保持カウントは増加しません。 IMHO弱い参照です。 – Centurion

+0

あなたは私に強い参照を教えてくださいできますか? – Hitesh

+0

私は、2番目のステートメント "[obj2保持];"それを強力な参照にします。はい、obj2はobj1へのポインタにすぎず、2つの保持カウントはメモリ内に割り当てられた同じオブジェクトに属し、IMHOはどこか1か所に格納されます。しかし、すべての+1保持カウントには所有者(少なくとも理論的)があり、私にとっては、その所有者がターゲット上に明示的(保持)または暗黙的(alloc)保持メッセージを送信するために使用されたvar/ivar /オブジェクト。 – Centurion

関連する問題