我正在浏览 IOS 的 Big Nerd Ranch(第 3 版)。我在 ARC 内存管理章节。它试图解释保留周期,它让我们修改一个简短的控制台应用程序,如下所示:
BNRItem 的标题:
@interface BNRItem : NSObject
{
NSString *itemName;
NSString *serialNumber;
int valueInDollars;
NSDate *dateCreated;
BNRItem *containedItem;
BNRItem *container;
}
+ (id)randomItem;
- (void)setItemName:(NSString *)str;
- (NSString *)itemName;
- (void)setSerialNumber:(NSString *)str;
- (NSString *)serialNumber;
- (void)setValueInDollars:(int) i;
- (int)valueInDollars;
- (void)setContainedItem:(BNRItem *)i;
- (BNRItem *)containedItem;
-(void)setContainer:(BNRItem *)i;
- (BNRItem *)container;
- (NSDate *)dateCreated;
- (id)initWithItemName:(NSString*)name valueInDollars:(int)value serialNumber:(NSString *)sNumber;
- (id)initWithItemName:(NSString *)name andSerialNumber:(NSString *)sNumber;
@end
主文件:
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSMutableArray *items = [[NSMutableArray alloc]init];
BNRItem *backpack = [[BNRItem alloc] init];
[backpack setItemName:@"Backpack"];
[items addObject:backpack];
BNRItem *calculator = [[BNRItem alloc]init];
[calculator setItemName:@"Calculator"];
[items addObject:calculator];
[backpack setContainer:calculator];
NSLog(@"Setting items to nil");
items = nil;
}
return 0;
}
现在在这之后它说:“根据我们迄今为止对内存管理的理解,当 items 设置为 nil 时,两个 BNRItems 都应该连同它们的实例变量一起被销毁”。在此之前,当我们的 BNRItem 被销毁时,我们需要覆盖 (void) dealloc 以打印出来。
所以我运行它,我想看看,因为背包现在对计算器有很强的参考,也不会被破坏。现在在控制台中,我看到两者都被破坏了,但我认为这是因为它们在应用程序结束时被破坏了。当我在将项目设置为 nil 后做一个断点时,什么都不会被破坏。这就是这本书所说的应该发生的事情......但它让我将容器设置为
__weak BNRItem *container
然后当我运行它时,它仍然没有被破坏。我假设是因为仍然有指向它的指针我没有设置为零?即使这本书在这一点上没有提到这样做。所以我理解书籍的解释(我认为),但实际上并没有发生。