在Objective C(w / ARC)中,为什么不使用弱引用?

时间:2013-06-28 01:43:42

标签: objective-c automatic-ref-counting

这是代码

@interface Test : NSObject {
    int val;
}

-(int) GetOne;
@end

@implementation Test
-(int) GetOne {
    return 1;
} 
@end

并使用像这样的测试类

Test * a = [Test new];
Test * __weak b = a;

[b GetOne];
a = nil;

printf("a=%p, b=%p\n", a, b);

结果是b不为0。 为什么会这样?

2 个答案:

答案 0 :(得分:3)

ARC将生成一系列内存管理调用,然后优化其不需要的内容。这与旧的手动内存管理完全不同。我没有声明要理解编译器在这方面的工作原理,这就是它的美妙之处;你不必理解。

将ARC视为一个神奇的黑盒子,它做出了一个承诺:如果您遵守规则,它将在最终之后自动清理。它可能不是在最早的时刻,但它会发生。

我假设你使用的是LLVM 4.2(附带Xcode 4.6),我测试了它。该对象确实最终在自动释放池中。这是ARC可以做得更好的一个例子,因为实际上并不需要自动释放。

按照这个想法,我也在LLVM 5.0编译器beta上尝试过它,行为也不同:对象会立即在a = nil上取消分配,如你所料。这是ARC在保持同样基本承诺的同时变得更聪明的一个很好的例子。

答案 1 :(得分:0)

ARC将帮助您释放和保留对象,但...... 该对象的确切时间是免费的

您应该阅读非ARC,然后是ARC。 stackoverflow上有太多关于它的人说了

(您可以阅读:ARC - The meaning of __unsafe_unretained?