这是代码
@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。 为什么会这样?
答案 0 :(得分:3)
ARC将生成一系列内存管理调用,然后优化其不需要的内容。这与旧的手动内存管理完全不同。我没有声明要理解编译器在这方面的工作原理,这就是它的美妙之处;你不必理解。
将ARC视为一个神奇的黑盒子,它做出了一个承诺:如果您遵守规则,它将在最终之后自动清理。它可能不是在最早的时刻,但它会发生。
我假设你使用的是LLVM 4.2(附带Xcode 4.6),我测试了它。该对象确实最终在自动释放池中。这是ARC可以做得更好的一个例子,因为实际上并不需要自动释放。
按照这个想法,我也在LLVM 5.0编译器beta上尝试过它,行为也不同:对象会立即在a = nil
上取消分配,如你所料。这是ARC在保持同样基本承诺的同时变得更聪明的一个很好的例子。
答案 1 :(得分:0)
ARC将帮助您释放和保留对象,但...... 该对象的确切时间是免费的。
您应该阅读非ARC,然后是ARC。 stackoverflow上有太多关于它的人说了