1

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

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

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

我希望 NSLog 向我显示“nil”,但它显示“Hi!”。为什么?这个字符串必须在第三行被释放。

4

2 回答 2

4

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

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

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

调试构建不会立即消除弱引用。

本质上,您不能在这样的独立函数中对 ARC 进行少量“测试”。

于 2014-01-16T11:07:03.400 回答
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 在后台自动释放对象,您可能必须等到事件循环的下一跳才能看到弱指针变为nil.

于 2014-01-16T11:12:07.823 回答