zoukankan      html  css  js  c++  java
  • 解决ARC的循环引用问题

    看看下面的程序有什么问题:

    BNRItem.h

    @interface BNRItem : NSObject
    
    @property (nonatomic, strong) BNRItem *containedItem;
    @property (nonatomic, strong) BNRItem *container;
    
    ...
    
    @end

    BNRItem.m

    #import "BNRItem.h"
    
    @implementation BNRItem
    
    ...
    
    - (void)setContainedItem:(BNRItem *)containedItem
    {
        _containedItem = containedItem;
        self.containedItem.container = self;
    }
    
    @end


    main.m

    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
    
            // Create a mutable array object, store its address in items variable
            NSMutableArray *items = [[NSMutableArray alloc] init];
    
            BNRItem *backpack = [[BNRItem alloc] initWithItemName:@"Backpack"];
            [items addObject:backpack];
    
            BNRItem *calculator = [[BNRItem alloc] initWithItemName:@"Calculator"];
            [items addObject:calculator];
    
            backpack.containedItem = calculator;
    
            backpack = nil;
            calculator = nil;
    
            for (BNRItem *item in items) {
                NSLog(@"%@", item);
            }
    
            // Destroy the mutable array object
            NSLog(@"Setting items to nil...");
            items = nil;
    
        }
        return 0;
    }

    上面的程序是有问题的,会导致循环引用(strong reference cycle)。

    导致内存泄露。

    解决方案:

    将某个指针的特性设置为弱引用

    @property (nonatomic, weak) BNRItem *container;

  • 相关阅读:
    关于postman返回参数
    字典(dict)
    序列(tuple)
    列表(List)
    字符串截取
    条件及循环语句
    函数
    变量和类型
    post请求
    django学习-5.获取url参数和name的作用
  • 原文地址:https://www.cnblogs.com/davidgu/p/4435352.html
Copyright © 2011-2022 走看看