这是一种情况:Hockeyapp和testflight时不时地抱怨我
"试图插入零对象"
在可变字典/数组中.我知道正确的方法是一直检查nil,并且当它有意义时我会这样做.我们的测试人员无法捕获那些崩溃,但AppStore用户显然可以.
我的猜测是,有时服务器会返回NSNulls.因此,不要在巨大的项目中插入nil的检查,我的想法是为测试人员创建一个单独的目标,并使用方法调整集合类.说,我将替换insertObject:atIndex为my swizzled_insertObject:atIndex,如果对象实际上是nil ,我会在崩溃之前记录/显示描述性报告.
事情是我不能使用调酒__NSPlaceholderDictionary或__NSArrayM (因为我不能在私人课程上制作类别)这让我很难过.
所以基本上我是在寻求关于如何捕捉那些令人讨厌的罕见崩溃的建议.我想到的一个解决方案是使用try-catch块,我知道它们在Objective-c中很昂贵,所以我不会在生产中使用它们,仅供测试人员使用.但是,包围方法try-catche包围-s #ifdef- #endif-s将清除代码的所有readableness.所以我正在寻找更优雅的解决方案.谢谢.
更新:堆栈跟踪不一定不是很具描述性,这是我得到的
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> …Run Code Online (Sandbox Code Playgroud) 我想为Symbolicate iOS Crash生成崩溃报告以查看崩溃日志,所以我想使用代码获取崩溃报告,目前我只得到:
* - [__ NSArrayM objectAtIndex:]:索引121超出界限[0 .. 23]
Application received signal SIGSEGV
(
0 CoreFoundation 0x3120e2bb + 186
1 libobjc.A.dylib 0x38f2b97f objc_exception_throw + 30
2 CoreFoundation 0x3120e1c5 + 0
3 myshine 0x001f9f51 myshine + 1503057
4 libsystem_c.dylib 0x393a9e8b _sigtramp + 34
5 myshine 0x000ac985 myshine + 137605
6 myshine 0x000ac35d myshine + 136029
7 CoreFoundation 0x311ab7cf + 74
)
not have
/ 1: Process Information
Incident Identifier: 30E46451-53FD-4965-896A-457FC11AD05F
CrashReporter Key: 5a56599d836c4f867f6eec76afee451bf9ae5f31
Hardware Model: iPhone4,1
Process: Rage Masters [4155] …Run Code Online (Sandbox Code Playgroud)