ARC代码中的__weak示例

时间:2014-01-16 11:00:31

标签: objective-c automatic-ref-counting weak

我试图了解__weak在ARC代码中是如何工作的。 这是我的例子:

NSString *string = @"Hi!"; //1
__weak NSString *secondString = string; //2
string = @"Hello world!"; //3

NSLog(@"STR: %@", secondString); //4

我希望NSLog向​​我显示“nil”,但它显示“嗨!”。 为什么?必须在第三行解除分配此字符串。

2 个答案:

答案 0 :(得分:4)

常量字符串是了解ARC的不良方法。记录是了解ARC的一种不好的方法。

常量字符串实际上是单例,永远不会释放。

记录以您不知道的方式捕获变量。

调试版本不会立即忽略弱引用。

基本上,你不能在像这样的独立功能中对ARC进行一些“测试”。

答案 1 :(得分:4)

这样的字符串是静态的,永远不会被释放。尝试使用手动分配的对象:

#import <Foundation/Foundation.h>

int main()
{
    NSObject* strongPtr = [NSObject new];
    NSObject* __weak weakPtr = strongPtr;
    NSLog(@"weak=%@", weakPtr);

    strongPtr = nil;
    NSLog(@"weak=%@", weakPtr);
}

输出应为

2014-01-16 15:07:49.376 a.out[34078:507] weak=<NSObject: 0x7fe391c08230>
2014-01-16 15:07:49.379 a.out[34078:507] weak=(null)

此类测试似乎失败的另一个常见原因是自动释放池 - 如果任何API自动释放场景后面的对象,您可能必须等到事件循环的下一跳才能看到弱指针变为{{1 }}