在Objective C(带有ARC),如果一个弱引用曾经被使用过,为什么不需要释放?

20 浏览
0 Comments

在Objective C(带有ARC),如果一个弱引用曾经被使用过,为什么不需要释放?

此问题已有答案:

把唯一的强引用置为nil后,弱NSString变量不是nil

以下是代码

@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日
0
0 Comments

ARC将帮助您释放和保持对象,但... 对象将在什么时间被释放

您应该先了解非ARC,然后再了解ARC。在stackoverflow上有太多的人说过这个。

(您可以阅读这个:ARC - __unsafe_unretained的含义?

0
0 Comments

ARC会产生一堆内存管理调用,然后优化掉不需要的调用。这是一种与旧的手动内存管理非常不同的过程。我不保证完全理解编译器的这方面工作,但这正是美妙之处;你不必理解。

把ARC看作一个神奇的黑匣子,它做出一个承诺:如果你遵循规则,它会自动清理掉你的内存,最终会发生。可能不是尽可能早发生,但一定会发生。

我假设你正在使用LLVM 4.2(随Xcode 4.6一起发布),并且我测试过了。对象确实最终处于自动释放池中。这是一个例子,说明ARC可以更好地处理,因为实际上并不需要自动释放。

考虑到这一点,我也在LLVM 5.0编译器版上尝试过,行为有所不同:在a = nil时,对象立即被释放,这是你所期望的。这是一个很好的例子,说明ARC变得更智能,同时仍然保持了同样的基本承诺。

0