在Objective C(带有ARC),如果一个弱引用曾经被使用过,为什么不需要释放?
在Objective C(带有ARC),如果一个弱引用曾经被使用过,为什么不需要释放?
此问题已有答案:
以下是代码
@interface Test : NSObject { int val; } -(int) GetOne; @end @implementation Test -(int) GetOne { return 1; } @end
以这种方式使用Test类
Test * a = [Test new]; Test * __weak b = a; [b GetOne]; a = nil; printf("a=%p, b=%p\n", a, b);
结果是b不为0。为什么会这样呢?
admin 更改状态以发布 2023年5月24日
ARC将帮助您释放和保持对象,但... 对象将在什么时间被释放。
您应该先了解非ARC,然后再了解ARC。在stackoverflow上有太多的人说过这个。
(您可以阅读这个:ARC - __unsafe_unretained的含义?)
ARC会产生一堆内存管理调用,然后优化掉不需要的调用。这是一种与旧的手动内存管理非常不同的过程。我不保证完全理解编译器的这方面工作,但这正是美妙之处;你不必理解。
把ARC看作一个神奇的黑匣子,它做出一个承诺:如果你遵循规则,它会自动清理掉你的内存,最终会发生。可能不是尽可能早发生,但一定会发生。
我假设你正在使用LLVM 4.2(随Xcode 4.6一起发布),并且我测试过了。对象确实最终处于自动释放池中。这是一个例子,说明ARC可以更好地处理,因为实际上并不需要自动释放。
考虑到这一点,我也在LLVM 5.0编译器版上尝试过,行为有所不同:在a = nil时,对象立即被释放,这是你所期望的。这是一个很好的例子,说明ARC变得更智能,同时仍然保持了同样的基本承诺。