3

iOS アプリが終了時にクラッシュするという問題があり、これに絞り込みました。

// File.h

struct Name {
    NSString *name;
}

// File.mm

Name names[] = {
    @"foo",
    @"bar",
};

アプリが終了すると (iPad のホーム ボタンを押すと)、クラッシュしobjc_msgSendEXC_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 をダンプできます。でも踏むと落ちる。

4

1 に答える 1