ARC solve the problem of circular references

Consider the following program has a problem:

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;
}

 

The above procedure is problematic, it will cause a circular reference (strong reference cycle).

A memory leak.

 

solution:

The characteristics of a weak pointer reference to

@property (nonatomic, weak) BNRItem *container;

 

Reproduced in: https: //www.cnblogs.com/davidgu/p/4435352.html

Guess you like

Origin blog.csdn.net/weixin_34043301/article/details/93802972