我试图了解__weak如何在 ARC 代码中工作。这是我的例子:
NSString *string = @"Hi!"; //1
__weak NSString *secondString = string; //2
string = @"Hello world!"; //3
NSLog(@"STR: %@", secondString); //4
我希望 NSLog 显示"nil",但它显示"嗨!为什么?此字符串必须在第三行解除分配。
像这样的字符串是静态的,永远不会被释放。尝试使用手动分配的对象:
#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
。
常量字符串是了解 ARC 的糟糕方法。日志记录是了解 ARC 的糟糕方式。
常量字符串实际上是单例,永远不会被释放。
日志记录以您不知道的方式捕获变量。
调试版本不会立即剔除弱引用。
从本质上讲,你不能在这样的独立函数中对 ARC 进行少量的"测试"。