私は非ARCベースのプロジェクトに取り組んだことはありません。ARCベースのプロジェクトでゾンビに出くわしました。保持サイクルが原因であることがわかりました。保持サイクルとは何でしょうか。
保持サイクルの例を教えてください。
私は非ARCベースのプロジェクトに取り組んだことはありません。ARCベースのプロジェクトでゾンビに出くわしました。保持サイクルが原因であることがわかりました。保持サイクルとは何でしょうか。
保持サイクルの例を教えてください。
保持サイクルは、オブジェクトがオブジェクトを保持し、同時にオブジェクトがオブジェクトをA
保持する状況です*。次に例を示します。B
B
A
@class Child;
@interface Parent : NSObject {
Child *child; // Instance variables are implicitly __strong
}
@end
@interface Child : NSObject {
Parent *parent;
}
@end
「バックリンク」の__weak
変数またはプロパティ、つまりオブジェクト階層内の直接または間接の親へのリンクを使用して、ARCの保持サイクルを修正できます。weak
@class Child;
@interface Parent : NSObject {
Child *child;
}
@end
@interface Child : NSObject {
__weak Parent *parent;
}
@end
保持サイクルとは次のとおりです。2つのオブジェクトが相互に参照を保持して保持されると、両方のオブジェクトが相互に保持しようとするため、保持サイクルが作成され、解放できなくなります。
@class classB;
@interface classA
@property (nonatomic, strong) classB *b;
@end
@class classA;
@interface classB
@property (nonatomic, strong) classA *a;
@end
ARCでの保持サイクルを回避するにはweak
、次のように、参照を使用してそれらの1つを宣言するだけです。
@property (nonatomic, weak) classA *a;
これは迅速ですが、iOSでの保持サイクルのインタラクティブなデモは次のとおりです:https ://github.com/nickm01/RetainCycleLoggerExample