問題を抱えている一部のベータ テスターから奇妙なクラッシュが発生しています。シンボリック化されたクラッシュ レポートは、クラッシュが init 呼び出しでシングルトンとしてのコントローラーの単純な割り当てで発生していることを示していますが、スタック トレースによると、私が持っているコードinit
は実際にはクラッシュの場所ではないようです。関連するコードは次のとおりです。
1534| + (UA[REDACTED]PlayerController*)sharedInstance
1535| {
1536| @synchronized(self)
1537| {
1538| if (sharedInstance == nil)
1539| sharedInstance = [[UA[REDACTED]PlayerController alloc] init];
1540| }
1541| return sharedInstance;
1542| }
これは以前にクラッシュしたことはなく、コードは最近変更されていません。発生したスタック トレースは次のとおりです。
Thread 5:
0 libSystem.B.dylib 0x33bd52d4 __kill + 8
1 libSystem.B.dylib 0x33bd52c4 kill + 4
2 libSystem.B.dylib 0x33bd52b6 raise + 10
3 libSystem.B.dylib 0x33be9d26 __abort + 62
4 libSystem.B.dylib 0x33be9d7e abort + 62
5 libSystem.B.dylib 0x33bd7980 __assert_rtn + 152
6 libgcc_s.1.dylib 0x32acab4e _Unwind_SjLj_Resume + 26
7 [REDACTED] 0x00060b64 +[UA[REDACTED]PlayerController sharedInstance] (UA[REDACTED]PlayerController.m:1540)
8 [REDACTED] 0x00063e6c -[UA[REDACTED]PlayerViewController setupControlViews] (UA[REDACTED]PlayerViewController.m:224)
9 [REDACTED] 0x00062ce0 -[UA[REDACTED]PlayerViewController viewDidLoad] (UA[REDACTED]PlayerViewController.m:268)
10 UIKit 0x320a0270 -[UIViewController view] + 104
…
この不可解なクラッシュが何であり、それがどこから来ているのかについてのアイデアはありますか?
更新 1
コア データと移行に関係しているようです。複製できましたが、根本的な原因はまだ不明です。このバージョンには自動移行がいくつかありますが、一部の NSManagedObjects は読み取ることができますが、他のものは特に NSManagedObjects 関係でこの例外をスローしているようです。とは全く関係ないかもしれません
PlayerController
。Core-Data の専門家は何か洞察を持っていますか?
UPDATE 2クラッシュを再現する方法 と関連するコード
を見つけた後のクラッシュのコールスタックは次のとおりです。

if (resultArray && [resultArray count]) {
for (MixAudio *ma in resultArray) {
Audio *audio = [ma valueForKey:LOCAL_MIX_AUDIO_AUDIO_KEY];
if (audio) {
[returnArray addObject:audio];
}
}
それを再現するために何をしたかを説明するために、データ構造を少し説明する必要があります。Mix
とAudio
アイテムを持っています。ミックスには多くのオーディオがあり、オーディオは多くのミックスに属しています。これは、オーディオを取得するための MixAudio オブジェクトに対する単純な関係呼び出しです。現在、これは、データベースを新しいバージョンに復元した後にのみ、ここでクラッシュしています。
私のセットアップでのデータベースのバックアップとは、データベースを圧縮してデータを保存し、復元時に解凍することを意味します。このクラッシュは、復元プロセスの後にのみ発生します。さらに複雑なことに、マッピング モデルを備えた 3 つのデータベース バージョンがあります。このプロセスはバージョン管理の前に機能していたため、私のバージョンの何かがこのクラッシュを引き起こしているように感じます。
他のすべてのデータは問題なく、アクセスでき、保存もできます。どういうわけか、この単一のフェッチが問題を引き起こしています。永続ストアまたは管理対象オブジェクト モデルの設定時に、エラーや警告は発生しません。さらに、新しい Mix オブジェクトは正常に作成およびアクセスできますが、(復元前に DB にあった) 古いフェッチのみが失敗します。
エラーが見つからない場合、コンソールに次のように表示されます。
Assertion failed: (_Unwind_SjLj_Resume() can't return), function _Unwind_SjLj_Resume, file /SourceCache/libunwind/libunwind-24.1/src/Unwind-sjlj.c, line 326.
クラッシュ行の前後に atry/catch
を配置すると、根本的なクラッシュの原因を調べることができます。
Error: NSRangeException: *** -[NSMutableArray objectAtIndex:]: index 4294967295 beyond bounds [0 .. 16]
しかし、これは (少なくとも私には) 単純なvalueForKey
呼び出しには意味がありません。4294967295 = 2^32-1 これは、インデックス var がおそらく -1 に設定されていたことを意味します。私はここで迷っています。
[解決済み] 更新 3バージョン管理に含まれていることについては正しかった:) Zarra の本の
バージョン管理に関するセクションを読み直し、DOHの重要な瞬間がありました。3 つのデータベース バージョンを持つアプリを使用したのはこれが初めてです。私は自分のアプリでマッピング モデルを使用していますが、コア データは 1 つのモデルを使用して 1-2 からマッピングし、次に次のモデルを使用して 2-3 にマッピングできると単純に想定していました。1-3 マッピング モデルを持っていないことに気付いたとき、私は文字通り頭を打ちました。それをテストするために、私はすぐに1つ追加しました.すべてがバターと同じくらい滑らかです. 今、私は戻って彼のサンプルを使用して、この DB のバージョンを増やしていくにつれて、私の人生を楽にする必要があります.
Progressive Data Migration
Zarra がここに車で来て、何か… 何でも答えてくれることを願っています。