这是一种情况:Hockeyapp 和 testflight 时不时抱怨我
“试图插入零对象”
在可变字典/数组中。我知道正确的做法是始终检查 nil,并且在有意义时我会这样做。我们的测试人员无法捕捉到这些崩溃,但 AppStore 用户显然可以。
我的猜测是,有时服务器不应该返回 NSNulls。所以不要在这个庞大的项目中到处插入对 nil 的检查,我的想法是为测试人员创建一个单独的目标,并为集合类使用方法调配。说,我将替换insertObject:atIndex
为 my swizzled_insertObject:atIndex
,如果对象实际上是 nil,我会在它崩溃之前记录/显示描述性报告。
问题是我不能使用 swizzling for __NSPlaceholderDictionary
or __NSArrayM
(只是因为我不能在私人课程上创建一个类别),这让我很伤心。
所以基本上我是在寻求关于如何捕捉那些令人讨厌的罕见崩溃的建议。我想到的一种解决方案是使用 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
....