ARCは、循環参照の問題を解決します

次のプログラムに問題がある考えてみます。

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で再現

おすすめ

転載: blog.csdn.net/weixin_34043301/article/details/93802972