0

我正在浏览 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 

然后当我运行它时,它仍然没有被破坏。我假设是因为仍然有指向它的指针我没有设置为零?即使这本书在这一点上没有提到这样做。所以我理解书籍的解释(我认为),但实际上并没有发生。

4

1 回答 1

1

我相信自动完成。

[backpack setContainer:calculator]

本来应该

[backpack setContainedItem:calculator]
于 2012-10-06T22:58:11.767 回答