我已经为以下问题提交了一个雷达(rdar://12311693,http ://openradar.appspot.com/12311693 ),但我想我也会在这里发布,看看是否有人能发现错误我的代码可能导致崩溃。
以下代码示例在打开编译器优化 (-Os) 时由于过度释放而导致崩溃,但在关闭编译器优化 (-O0) 时不会崩溃。该项目正在使用 Xcode 4.4.1 (4F1003)、Apple LLVM 编译器 4.0 构建
当 num2 过度释放时,应用程序崩溃。启用 Zombie Objects 以确认是这种情况。
// This crashes under -Os, but not under -O0
NSNumber *num1 = @((float)arc4random() / (float)UINT32_MAX);
NSNumber *num2 = @((float)arc4random() / (float)UINT32_MAX);
NSNumber *foo1 = num1;
NSNumber *foo2 = num2;
for (NSUInteger i=0; i<2; i++) {
NSLog(@"foo1: %p %@", foo1, foo1);
NSLog(@"foo2: %p %@", foo2, foo2);
// swap foo1 and foo2
foo1 = num2;
foo2 = num1;
}