2012-10-09 9 views
9

私はARCベースではないプロジェクトで働いたことがありません。 ARCベースのプロジェクトでゾンビを見つけました。私はそれが保持サイクルのためであることが分かった。私はちょうど保持サイクルが何であるか疑問に思っている。ARCでサイクルを保持

私は保持サイクルの例を教えてくれませんか?

+4

ゾンビが原因で保持サイクルの発生しません。 – bbum

答えて

22

Aサイクルは、オブジェクトABオブジェクト、及びBオブジェクト保持するときの状況である保持オブジェクトAを同時に保持*

@class Child; 
@interface Parent : NSObject { 
    Child *child; // Instance variables are implicitly __strong 
} 
@end 
@interface Child : NSObject { 
    Parent *parent; 
} 
@end 

は、あなたがあなたの「バックリンク」のために__weak変数やweakプロパティを使用して、ARCでのサイクルを保持固定することができ、すなわちオブジェクト階層における指示するリンクまたは間接的な親:

@class Child; 
@interface Parent : NSObject { 
    Child *child; 
} 
@end 
@interface Child : NSObject { 
    __weak Parent *parent; 
} 
@end 
ここでは一例であり、


*これは保持サイクルの最も基本的な形式です。互いに円を維持するオブジェクトの長いチェーンが存在する可能性があります。

+2

保持サイクルによってARCでメモリリークが発生しますか? – Raj

+0

@Raj絶対に!保持サイクルはARC固有ではなく、ARCシナリオと非ARCシナリオの両方でメモリリークを引き起こします。 – dasblinkenlight

+0

私は@ Simon_Germainの答えに対するコメントで説明したように、それらがメモリリークを引き起こすのを避けることができます。 – trss

9

保持サイクルは次のとおりです。2つのオブジェクトが互いに参照を保持して保持されている場合、両方のオブジェクトが互いを保持しようとするため保持サイクルが作成され、解放できなくなります。

@class classB; 

@interface classA 

@property (nonatomic, strong) classB *b; 

@end 


@class classA; 

@interface classB 

@property (nonatomic, strong) classA *a; 

@end 

ようなので、単純に、weak参照して、それらのいずれかを宣言し、ARCとサイクル維持避けるために:

@property (nonatomic, weak) classA *a; 
+0

公開できませんか?チェーンの権利を壊しているプロパティのうちの1つに対して他のオブジェクトを再割り当てするように注意していれば、リリースされる可能性がありますか?私は多くの時間を解放することは不可能だと聞いたので、私は特に尋ねています。 – trss

+0

「保持サイクルを避けるルール#4:サイクルを中断する「終了」方法」を参照してください。http://www.cocoawithlove.com/2009/07/rules-to-avoid-retaincycycles.html保持サイクルを中断することが可能である。他の方法では複雑さを避けるのは間違いありませんが、メモリリークが発生する前に壊れてしまい、リークを避けるために注意して使用することができます。 – trss

+0

不可能なことは少し誇張されているかもしれませんが、それはちょうどそれほど些細なことではないと言いましょう。不可能はない。 –

関連する問題