我是Objective C的新手,有一些问题我自己无法回答。 我有一段用于测试__weak变量的代码块(当然我使用ARC):
NSString *myString = [[NSString alloc] initWithFormat:@"John"];
NSString * __weak weakString = myString;
myString = nil; //<-- release the NSString object
NSLog(@"string: %@", weakString);
以上代码的输出与预期相符,因为weakString是一个弱引用变量。2013-01-02 11:42:27.481 ConsoleApp[836:303] string: (null)
但是当我将代码修改为这样:
NSString *myString = [[NSString alloc] initWithFormat:@"John"];
NSString * __weak weakString = myString;
NSLog(@"Before: %@", weakString); //<--- output to see if the __weak variable really works.
myString = nil;
NSLog(@"After: %@", weakString);
输出结果完全不是我期望的:
2013-01-02 11:46:03.790 ConsoleApp[863:303] Before: John
2013-01-02 11:46:03.792 ConsoleApp[863:303] After: John
后面那个 NSLog 的输出必须是 (nil),而不是 "John"。我已经尝试在许多文档中搜索,但没有找到这种情况的答案。有人可以给出一个合理的解释吗?提前感谢。
NSString
,由于性能优化而不参与通常的内存管理。这里的发布者使用initWithFormat
来避免这个问题。 - zoul