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;

  • 相关阅读:
    mysql in like GROUP_CONCAT
    StringBuilder的常用方法
    mysql 中unionall 使用
    mysql中,数据库字段为时间戳转时间的处理方法
    一个数组储存多个对象
    Java中的substring()用法
    java思想篇1
    任务调配管理
    字符窜数组去重及各种常规用法
    自定义属性的设值
  • 原文地址:https://www.cnblogs.com/davidgu/p/4435352.html
Copyright © 2011-2022 走看看