@autoreleasepool {
__weak NSArray* obj1 = [NSArray arrayWithObject:[[ClassA alloc] init]];
NSLog(@"%@", obj1);
__weak NSArray* obj2 = [[NSArray alloc] initWithObjects:[[ClassA alloc] init], nil];
NSLog(@"%@", obj2);
}
对于obj2,结果为“null”,这是正确的,但对于obj1,结果为“ClassA:0x100109b40”。我不明白,为什么?
答案 0 :(得分:4)
这取决于自动释放语义。引用obj1
返回自动释放,因此自动释放池“拥有”(即池具有强引用)。它将一直存在直到池耗尽,因为弱引用不是对象的唯一引用。
第二个对象不是由弱引用以外的任何东西“拥有”。因此,编译器会推断它可以立即释放。
答案 1 :(得分:0)
如果您正在使用ARC(自动引用计数),obj2
在创建后立即释放,因为只有弱引用。在ARC中,只要有一个强大的指针,对象就会一直存在。由于您正在创建弱指针,因此会立即释放该对象
obj1
然而是自动释放的。这意味着对象将继续生效,直到自动释放池耗尽。在ARC术语中:自动释放池包含对它的强引用。由于自动释放池在调用NSLog(@"%@", obj1);
时尚未耗尽,您仍然可以访问和使用该对象。
您可能需要阅读这些文档以了解有关自动和手动引用计数之间差异的更多信息:
http://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html