9

私は非ARCベースのプロジェクトに取り組んだことはありません。ARCベースのプロジェクトでゾンビに出くわしました。保持サイクルが原因であることがわかりました。保持サイクルとは何でしょうか。

保持サイクルの例を教えてください。

4

3 に答える 3

24

保持サイクルは、オブジェクトがオブジェクトを保持し、同時にオブジェクトがオブジェクトをA保持する状況です*。次に例を示します。BBA

@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


*これは保持サイクルの最も原始的な形式です。円の中にお互いを保持するオブジェクトの長いチェーンがあるかもしれません。

于 2012-10-09T14:38:52.640 に答える
10

保持サイクルとは次のとおりです。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;
于 2012-10-09T14:37:40.673 に答える
0

これは迅速ですが、iOSでの保持サイクルのインタラクティブなデモは次のとおりです:https ://github.com/nickm01/RetainCycleLoggerExample

于 2016-07-11T01:33:59.757 に答える