Apple LLVM3.1 Compiler の -O1 以上の最適化をかけてコンパイルすると、ARC のリファレンスカウントがおかしくなってクラッシュする現象が発覚。(CashFlow はこれが原因でクラッシュしてました)
以下のコードで完全に再現します。
UIButton *b, *b1, *b2; for (int i = 0; i < 2; i++) { b = [UIButton buttonWithType:UIButtonTypeRoundedRect]; if (i == 0) { b1 = b; } else { b2 = b; } } b = nil; int rc1 = CFGetRetainCount((__bridge void *)b1); int rc2 = CFGetRetainCount((__bridge void *)b2);
rc1, rc2 にはそれぞれ b1, b2 のリファレンスカウントが入ります。こいつは両方共2になるはずです (b1, b2 自身、および autorelease プールからの参照で2)。ですが、rc1 のほうが1になります。このため、メモリを二重解放しようとして落ちます。
うん、これじゃ ARC 使用時は怖くて最適化できませんな。さて、、、バグ報告、Apple のどこにすればいいんだっけ?
追記: https://bugreport.apple.com/ からバグ報告しました。