解决ARC的循环引用问题

简介: 看看下面的程序有什么问题: BNRItem.h @interface BNRItem : NSObject @property (nonatomic, strong) BNRItem *containedItem; @property (nonatomic, strong) BNRItem *container; .

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

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;

 

目录
相关文章
|
安全 程序员
单例 ARC下以及MRC 一句代码搞定
单例 ARC下以及MRC 一句代码搞定
42 0
|
1天前
|
Swift
Swift 自动引用计数(ARC)
Swift 自动引用计数(ARC)
6 1
|
Swift
Swift5.1—强引用循环与weak
Swift5.1—强引用循环与weak
235 0
Swift5.1—强引用循环与weak
Block循环引用
Block循环引用
93 0
|
Java 开发者