これが状況です:Hockeyappとtestflightは時々私について不平を言います
「nil オブジェクトを挿入しようとしています」
変更可能な辞書/配列で。私は正しいことは常に nil をチェックすることであり、それが理にかなっているときはそうする..私たちのテスターはそれらのクラッシュをキャッチすることはできませんが、AppStore ユーザーは明らかにできる.
私の推測では、サーバーが返すべきではないときに NSNull を返すことがあります。したがって、巨大なプロジェクトのどこにでも nil のチェックを挿入しないように、テスター用に別のターゲットを作成し、コレクション クラスにメソッド スウィズリングを使用するというのが私の考えでした。オブジェクトが実際にnilinsertObject:atIndex
のswizzled_insertObject:atIndex
場合、クラッシュする前に説明的なレポートをログに記録/表示します。
__NSPlaceholderDictionary
問題は、または__NSArrayM
(プライベート クラスでカテゴリを作成できないという理由だけで) にスウィズリングを使用できないことです。
基本的には、これらの厄介なまれなクラッシュを検出する方法についてアドバイスを求めています。私が念頭に置いている解決策の 1 つは、try-catch ブロックを使用することです。Objective-c ではそれらが高価であることはわかっているため、本番環境では使用せず、テスターのみに使用します。try-catche
ただし、 -s で囲まれたメソッドは、 #ifdef
-- s で囲まれ#endif
ており、コードの可読性がすべて失われます。だから私はよりエレガントなソリューションを探しています。ありがとう。
更新: スタック トレースは残念ながらあまり説明的ではありません。
Exception Type: SIGABRT
Exception Codes: #0 at 0x3a378350
Crashed Thread: 0
Application Specific Information:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[2]'
Last Exception Backtrace:
0 CoreFoundation 0x321522a3 <redacted> + 163
1 libobjc.A.dylib 0x39e7a97f _objc_exception_throw + 31
2 CoreFoundation 0x320a355f <redacted> + 135
3 CoreFoundation 0x320da0d3 <redacted> + 51
....