【发布时间】:2014-11-27 23:20:11
【问题描述】:
我在覆盖 encodeWithCoder: 方法时遇到了异常奇怪的崩溃。你可以在https://github.com/reidmain/FDModel/blob/193b0661f7ab1ce62f80de02bcbfa10a38c58ce9/FDModel/FDModel.m#L340-358看到我的实现
我收到了数万条类似于以下内容的崩溃日志:
Exception Type: SIGSEGV
Exception Codes: SEGV_ACCERR at 0x5000000c
Crashed Thread: 0
Application Specific Information:
objc_msgSend() selector name: replacementObjectForKeyedArchiver:
Thread 0 Crashed:
0 libobjc.A.dylib 0x38acb626 objc_msgSend + 6
1 Foundation 0x2eca70d7 _encodeObject + 128
2 MyApp 0x00411d8b -[FDModel encodeWithCoder:] + 268
3 Foundation 0x2eca7479 _encodeObject + 1058
4 Foundation 0x2eca8657 -[NSKeyedArchiver _encodeArrayOfObjects:forKey:] + 396
5 Foundation 0x2eca8329 -[NSDictionary(NSDictionary) encodeWithCoder:] + 918
6 Foundation 0x2eca7479 _encodeObject + 1058
7 Foundation 0x2ecf432d +[NSKeyedArchiver archiveRootObject:toFile:] + 202
8 MyApp 0x003dd561 -[MyAppsDataClient _saveObjectsToDisk] + 74
问题在于,公司内部没有人亲身经历过这些崩溃。即使在编写了一个压力测试,它调用了每隔几秒钟触发一次编码并让它运行一个小时的方法,也没有任何反应。
看起来 FDModel 或它试图编码的对象以某种方式从内存中释放,但这是如何发生的对我来说仍然是一个谜。如果 FDModel 从内存中释放, _encodeObject 将如何成功调用?如果它是从内存中释放的 FDModel,我希望看到关于 FDModel 上调用的各种方法的大量崩溃日志,但它不存在于内存中。所有的崩溃都在抱怨replacementObjectForKeyedArchiver:
【问题讨论】:
-
@gagarwal 该问题没有任何有用的答案。
标签: ios objective-c nskeyedarchiver