我最近从 Mavericks 升级到 Yosemite,现在我的单元测试失败了。问题归结为指向字符串内容的弱指针中的拼写错误。请看下面的示例代码:
NSString* value1;
NSString* value2;
__weak NSString* weakValue1;
__weak NSString* weakValue2;
NSMutableString* resultText = [NSMutableString new];
@autoreleasepool
{
value1 = [NSString stringWithFormat: @"Hello: %d", 1];
value2 = [NSString stringWithFormat: @"Hello %d", 2];
weakValue1 = value1;
weakValue2 = value2;
[resultText appendFormat: @" value1 = %@", weakValue1];
[resultText appendFormat: @" value2 = %@", weakValue2];
value1 = nil;
value2 = nil;
}
[resultText appendFormat: @" value1 = %@", weakValue1];
[resultText appendFormat: @" value2 = %@", weakValue2];
NSLog( @"resultText = %@", resultText );
这段代码的输出是:
resultText = value1 = Hello: 1 value2 = Hello 2 value1 = (null) value2 = Hello 2
我本来期望:
resultText = value1 = Hello: 1 value2 = Hello 2 value1 = (null) value2 = (null)
第二value2
也成为(null)
但事实并非如此。请注意内容的差异value1
and value2
. value2
缺少冒号。我不懂为什么weakValue2
不自零时value2
被设定为nil
。一旦我将冒号放回字符串中,我就会得到我期望的结果。在 Mavericks 中运行此代码时,我没有看到此行为。
有谁知道为什么会发生这种情况?
我注意到在这question https://stackoverflow.com/questions/9096008/weak-property-not-zeroing-using-arc?rq=1多线程的有效点可能会导致弱指针不及时自零,但这不是这里发生的情况。首先,我不是多线程的,如果我单步执行代码并查看变量而不是使用 NSLog 打印它们,我会得到完全相同的结果。