【问题标题】:Crash occurring inside encodeWithCoder: on replacementObjectForKeyedArchiver: method在 encodeWithCoder 内部发生崩溃:在 replacementObjectForKeyedArchiver:方法上
【发布时间】: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:

【问题讨论】:

标签: ios objective-c nskeyedarchiver


【解决方案1】:

在通过dev forums 与 Apple 员工交谈后,问题似乎是由于模型在修改的同时被编码。

updatedFDModel 在对模型进行更改或对模型进行编码时使用 NSRecursiveLock。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多