3

这是代码

@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。为什么会这样?

4

2 回答 2

3

ARC 将生成大量内存管理调用,然后优化掉它确定不需要的内容。这是一个与旧的手动内存管理非常不同的过程。我没有声称要理解编译器在这方面是如何工作的,这就是它的美妙之处。你不必明白。

把 ARC 想象成一个神奇的黑匣子,它做出一个承诺:如果你遵守规则,它最终会在你之后自动清理。它可能不会在最早的时刻发生,但它会发生。

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

遵循这个想法,我还在 LLVM 5.0 编译器 beta 上进行了尝试,但行为有所不同:对象立即被释放,a = nil正如您所期望的那样。这是 ARC 在保持相同基本承诺的同时变得更聪明的一个很好的例子。

于 2013-06-28T02:41:58.867 回答
0

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

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

(你可以阅读这个:ARC - The meaning of __unsafe_unretained?

于 2013-06-28T02:41:31.597 回答