0
@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”。我不明白,为什么?

4

2 回答 2

4

这取决于自动释放语义。引用obj1被自动释放返回,因此被自动释放池“拥有”(即池对它有一个强引用)。因此它会一直存活到池耗尽,因为弱引用不是对该对象的唯一引用。

第二个对象不被弱引用以外的任何东西“拥有”。因此,编译器会推断它可以立即发布。

于 2013-08-15T12:20:44.007 回答
0

如果您使用 ARC(自动引用计数)obj2,则在创建后立即发布它,因为它只有一个弱引用。在 ARC 中,只要有指向它的强指针,对象就会一直存在。由于您正在创建一个弱指针,因此该对象会立即被释放。
obj1但是是自动释放的。这意味着对象将一直存在,直到自动释放池耗尽。在 ARC 术语中:自动释放池对它有很强的引用。由于调用时自动释放池尚未耗尽NSLog(@"%@", obj1);,因此您仍然可以访问和使用该对象。

您可能想阅读这些文档以了解有关自动和手动引用计数之间差异的更多信息:http:
//developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

于 2013-08-15T12:20:16.783 回答