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