我正在浏览IOS (第三版)的Big Nerd Ranch。我在读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;
}现在它说:“根据我们到目前为止对内存管理的理解,当BNRItems设置为nil时,两个items都应该连同它们的实例变量一起销毁”。在此之前,当我们的BNRItem被销毁时,它让我们重写(无效) dealloc打印出来。
所以我运行它,我应该看到,因为backpack现在有一个很强的引用计算器,也不会被销毁。现在在控制台中,我看到两者都被销毁了,但我认为这是因为它们在应用程序结束时都被销毁了。当我在将项目设置为零之后进行断点时,没有任何东西会被破坏。书上说这是应该发生的..。但这会让我将容器设置为
__weak BNRItem *container 然后,当我运行它时,仍然没有任何东西被破坏。我假设是因为仍然有指向它的指针,所以我没有设置为零?即使这本书在这一点上没有提到要这样做。所以我理解书中的解释(我想),但在实践中这是不会发生的。
发布于 2012-10-07 06:58:12
我相信自动补全功能。
[backpack setContainer:calculator]应该是
[backpack setContainedItem:calculator]https://stackoverflow.com/questions/12764529
复制相似问题