在 ARC 项目中,我将 __weak ivar(声明为id __weak weakLayer;
)设置为 CALayer,该 CALayer 由其超级层保留。大多数时候这有效。有时,weak ivar 测试为零。我编写了一些测试代码来简化演示问题的调试。我希望这是一个无限循环,但它会爆发,通常在不到 20 次迭代中。突破所需的迭代次数并不一致。
array = [NSMutableArray array];
while (1) {
CALayer *layer = [CALayer layer];
[array addObject:layer];
weakLayer = layer;
if (!weakLayer) {
NSLog (@"nil");
break;
}
NSLog(@"not nil");
}
po weakLayer
如果我使用内部的操作删除断点if
,它会打印一个有效的对象。我已经使用 Lion 和 Mountain Lion SDK 在 Xcode 4.3.3 和 4.4 上进行了测试。