次のプログラムに問題がある考えてみます。
BNRItem.h
@interface BNRItem:NSObjectの @property(、非アトミック強い)BNRItem * containedItem。 @property(非アトミック、強い)BNRItem *の容器。 ... @end
BNRItem.m
#importを " BNRItem.h " @implementation BNRItem ... - (無効)setContainedItem:(BNRItem * )containedItem { _containedItem = containedItem。 self.containedItem.container = 自己; } @end
main.m
INT(メインint型 ARGC、CONST のchar *のARGV []) { @autoreleasepool { //は可変配列オブジェクトを作成し、項目に変数のアドレスを格納 NSMutableArrayのを*商品= [[NSMutableArrayのALLOC] INIT] BNRItem *リュック= [[BNRItemのalloc] initWithItemName:"@ リュック" ]; [アイテムのaddObject:リュック]。 BNRItem *電卓= [[BNRItemのalloc] initWithItemName:@ " 電卓" ]; 【項目はADDOBJECT:電卓]。 backpack.containedItem =電卓; リュック = nilを; 電卓 = nilを; 用(BNRItem *アイテムにおけるアイテム){ のNSLog("@ %の@ " 、項目)。 } // 可変配列オブジェクトを破壊する のNSLog("@ nilに設定項目を... " ); 項目 = nilを; } 戻り 0 。 }
上記の手順は、循環参照(強い基準周期)を原因となり、問題です。
メモリリーク。
ソリューション:
への弱いポインタ参照の特性
@property(非アトミック、弱い)BNRItem * コンテナ。
ます。https://www.cnblogs.com/davidgu/p/4435352.htmlで再現