在encodeWithCoder中发生崩溃:在replacementObjectForKeyedArchiver:方法上

时间:2014-11-27 23:20:11

标签: ios objective-c nskeyedarchiver

我在覆盖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:

1 个答案:

答案 0 :(得分:1)

dev forums上与Apple员工交谈后,问题似乎是因为模型在被修改的同时进行编码。

I updated FDModel只要对模型进行更改或模型编码时就使用NSRecursiveLock。