1

次の呼び出しの直後に、iOS アプリで SIGSEGV クラッシュが発生しました。

[[NSUserDefaults standardUserDefaults] synchronize];

これは、同期コマンドの直後のクラッシュ スタック トレースの一部です。

CoreFoundation 0x31920232 CFCopyTypeIDDescription + 29
CoreFoundation 0x3191cd41 <redacted> + 204
CoreFoundation 0x31910815 <redacted> + 16
CoreFoundation 0x3188e1ac <redacted> + 140
CoreFoundation 0x3189d1ff CFDictionaryApplyFunction + 158
CoreFoundation 0x3191c483 <redacted> + 282
CoreFoundation 0x318b237f CFPropertyListWriteToStream + 138
CoreFoundation 0x318b115d <redacted> + 296
CoreFoundation 0x318b1031 <redacted> + 132
CoreFoundation 0x318b03c1 <redacted> + 492
CoreFoundation 0x318b01d1 <redacted> + 20
CoreFoundation 0x318bb3ff <redacted> + 110
CoreFoundation 0x318bb8fb <redacted> + 74
CoreFoundation 0x3193cb3b <redacted> + 30
CoreFoundation 0x3193d509 <redacted> + 32
libdispatch.dylib 0x39bd54b7 <redacted> + 22
libdispatch.dylib 0x39bd99f7 <redacted> + 30
CoreFoundation 0x318c7045 CFPreferencesAppSynchronize + 312

これはまれなクラッシュであるため、再現できません。私の質問は次のとおりです。

このようなクラッシュの原因は何ですか?

4

2 に答える 2

1

この種の状況を回避し、デフォルトをより適切に制御するために私が行っていることは、appDelegate (シングルトン クラスも機能します) を介してすべてを集中させることです。私の場合、何かを保存したいときは、指定されたオブジェクトに送信するという考え方です:

[appDelegate defaultsSetObject:(id)obj forKey:(NSSString *)key];

そのメソッドではcopy、obj と key (変更可能なオブジェクトの場合)。あなたのように私がトラブルに巻き込まれた場合、すべての呼び出しで同期を呼び出すことができます (即時の失敗を強制するため)、または少なくともすべてをログに記録します。

問題を再現するのが難しい場合は、時間をかけてデフォルト コードを再編成する価値があるかもしれません。一方、マクロを作成し、すべてのデフォルト コードをマクロに置き換え、マクロを再定義することで、私が行ったのと同様の動作を得ることができます。[マクロは次のようになります。

SAVE_OBJECT_FOR_KEY(obj, key);

最も単純なコマンドの場合は、オブジェクトを保存するだけです。デバッグするときは、上記で提案したようにコピーを行い、保存してから同期します。

于 2013-11-14T14:44:01.767 に答える