我在调用后立即在我的ios应用程序中遇到了SIGSEGV崩溃:
[[NSUserDefaults standardUserDefaults] synchronize];
这是同步命令后的崩溃堆栈跟踪的一部分:
CoreFoundation 0x31920232 CFCopyTypeIDDescription + 29
CoreFoundation 0x3191cd41 <redacted> + 204
CoreFoundation 0x31910815 <redacted> + 16
CoreFoundation 0x3188e1ac <redacted> + 140
CoreFoundation 0x3189d1ff CFDictionaryApplyFunction + 158
CoreFoundation 0x3191c483 <redacted> + 282
CoreFoundation 0x318b237f CFPropertyListWriteToStream + 138
CoreFoundation 0x318b115d <redacted> + 296
CoreFoundation 0x318b1031 <redacted> + 132
CoreFoundation 0x318b03c1 <redacted> + 492
CoreFoundation 0x318b01d1 <redacted> + 20
CoreFoundation 0x318bb3ff <redacted> + 110
CoreFoundation 0x318bb8fb <redacted> + 74
CoreFoundation 0x3193cb3b <redacted> + 30
CoreFoundation 0x3193d509 <redacted> + 32
libdispatch.dylib 0x39bd54b7 <redacted> + 22
libdispatch.dylib 0x39bd99f7 <redacted> + 30
CoreFoundation 0x318c7045 CFPreferencesAppSynchronize + 312
这是罕见的崩溃所以我无法重现它,我的问题是:
什么可能导致这样的崩溃?
答案 0 :(得分:1)
我要做的是尝试避免这种情况,并且更好地控制默认值,是通过我的appDelegate汇集所有内容(单例类也适用)。这个想法是,当你想保存某些东西时,你把它发送到指定的对象,在我的情况下:
[appDelegate defaultsSetObject:(id)obj forKey:(NSSString *)key];
在该方法中,我copy
obj和key(如果它们是可变对象)。如果我像你现在一样遇到麻烦,我可以在每次通话时调用同步(强制立即失败),或者至少记录所有内容。
如果您的问题难以重现,花时间重新组织您的默认代码可能是值得的。另一方面,您可以创建一个宏,用宏替换所有默认代码,并通过重新定义宏获得与我所做的相似的行为。 [宏将是这样的:
SAVE_OBJECT_FOR_KEY(obj, key);
在最简单的命令案例中,只需保存对象即可。调试时,按照我的建议进行复制,保存,然后同步。
答案 1 :(得分:0)
之前用户默认值返回的某些对象很可能已被过度释放。当包含该对象的NSUserDefaults中的字典被序列化为plist时,当它尝试序列化现在已死的对象时发生崩溃