私はARCベースではないプロジェクトで働いたことがありません。 ARCベースのプロジェクトでゾンビを見つけました。私はそれが保持サイクルのためであることが分かった。私はちょうど保持サイクルが何であるか疑問に思っている。ARCでサイクルを保持
私は保持サイクルの例を教えてくれませんか?
私はARCベースではないプロジェクトで働いたことがありません。 ARCベースのプロジェクトでゾンビを見つけました。私はそれが保持サイクルのためであることが分かった。私はちょうど保持サイクルが何であるか疑問に思っている。ARCでサイクルを保持
私は保持サイクルの例を教えてくれませんか?
Aサイクルは、オブジェクトA
はB
オブジェクト、及び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
ここでは一例であり、
保持サイクルによってARCでメモリリークが発生しますか? – Raj
@Raj絶対に!保持サイクルはARC固有ではなく、ARCシナリオと非ARCシナリオの両方でメモリリークを引き起こします。 – dasblinkenlight
私は@ Simon_Germainの答えに対するコメントで説明したように、それらがメモリリークを引き起こすのを避けることができます。 – trss
保持サイクルは次のとおりです。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;
公開できませんか?チェーンの権利を壊しているプロパティのうちの1つに対して他のオブジェクトを再割り当てするように注意していれば、リリースされる可能性がありますか?私は多くの時間を解放することは不可能だと聞いたので、私は特に尋ねています。 – trss
「保持サイクルを避けるルール#4:サイクルを中断する「終了」方法」を参照してください。http://www.cocoawithlove.com/2009/07/rules-to-avoid-retaincycycles.html保持サイクルを中断することが可能である。他の方法では複雑さを避けるのは間違いありませんが、メモリリークが発生する前に壊れてしまい、リークを避けるために注意して使用することができます。 – trss
不可能なことは少し誇張されているかもしれませんが、それはちょうどそれほど些細なことではないと言いましょう。不可能はない。 –
これは迅速であるが、ここでのiOSに保持サイクルのインタラクティブデモです:https://github.com/nickm01/RetainCycleLoggerExampleは
ゾンビが原因で保持サイクルの発生しません。 – bbum