Objective c 使用IOS 6进行ARC内存管理

Objective c 使用IOS 6进行ARC内存管理,objective-c,automatic-ref-counting,Objective C,Automatic Ref Counting,我正在通过IOS(第三版)的大书呆子农场。我在ARC内存管理章节。它试图解释保留周期,并让我们修改一个简短的控制台应用程序,如下所示: BNRItem的标题: @interface BNRItem : NSObject { NSString *itemName; NSString *serialNumber; int valueInDollars; NSDate *dateCreated; BNRItem *containedItem; BNRI

我正在通过IOS(第三版)的大书呆子农场。我在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时,两个bnritem都应该与其实例变量一起销毁”。在此之前,当我们的bNitem被销毁时,它让我们覆盖(作废)dealloc打印出来

所以我运行它,我想看看,因为背包现在有一个强大的参考计算器,不会被摧毁。现在在控制台中,我看到两者都被破坏了,但我认为这是因为它们在应用程序结束时被破坏了。当我在将项目设置为零后设置断点时,没有任何东西被破坏。这就是书上说的应该发生的事。。。但这让我把容器设置为

__weak BNRItem *container 

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

我相信自动完成

[backpack setContainer:calculator]
应该是

[backpack setContainedItem:calculator]

+1查找错误-您也应该接受您的答案,以便在主页上我们都可以看到问题已得到回答:)是的,对不起。我说我要等两天,然后我就忘了。