iOS アプリが終了時にクラッシュするという問題があり、これに絞り込みました。
// File.h
struct Name {
NSString *name;
}
// File.mm
Name names[] = {
@"foo",
@"bar",
};
アプリが終了すると (iPad のホーム ボタンを押すと)、クラッシュしobjc_msgSend
てEXC_BAD_ACCESS (SIGSEGV)
. デストラクタで起こっていName::~Name()
ます。
0 libobjc.A.dylib 0x37586e3a objc_release + 10
1 MyApp 0x0014abfc Name::~Name() (NameManager.h:21)
2 MyApp 0x0014ab42 Name::~Name() (NameManager.h:21)
3 MyApp 0x0014ad94 __cxx_global_array_dtor + 120
4 libsystem_c.dylib 0x36bba1cc __cxa_finalize + 216
5 libsystem_c.dylib 0x36b854f6 exit + 6
これは .mm ファイルにあるため、obj-c++ としてコンパイルされていることに注意してください。
これは何ヶ月もの間うまくいきました。いつ発生し始めたのか正確にはわかりませんが、xcode 4.4 にアップデートしたときだったと思われます。
NSString
リテラルは複数のリリースから保護する必要があります (または常に保護されていました) が、とにかくここでそれが起こっているとは思いません。
xcode 4.4で何かが変更されたかどうか誰か知っていますか?
次のようにしてクラッシュを修正できます。
struct Name {
__unsafe_unretained NSString *name;
}
しかし、以前は機能していたものが機能しなくなった理由を理解せずに、それを行うのは嫌いです。あるいは、うまくいかなかったかもしれません。メモリの上書きも怖いので、これは単なる症状かもしれません。
これは、DEBUG と RELEASE の両方で発生します。
更新: ~Name() にブレークポイントを設定し、メモリが破損していないことを確認しました。LLDB は NSString OK をダンプできます。でも踏むと落ちる。