我偶尔会遇到这种崩溃,在一个我不知道的线程中,我提到了CFXPreferencesPropertyListSourceSynchronizer和CFXPreferencesPropertyListSource。 我有一个单独的线程来访问NSUserDefaults。 (NSUserDefaults应该是线程安全的。)任何人都认识到这里出了什么问题?
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x444e4128
Crashed Thread: 5
Thread 5 name: Dispatch queue: CFPreferences Background Sync Queue
Thread 5 Crashed:
0 libobjc.A.dylib 0x34ec4f78 objc_msgSend + 16
1 CoreFoundation 0x3710de90 CFRetain + 76
2 CoreFoundation 0x3718aa96 __CFDictionaryStandardRetainValue + 62
3 CoreFoundation 0x37114fe0 CFBasicHashCreateCopy + 832
4 CoreFoundation 0x37124f50 CFDictionaryCreateMutableCopy + 388
5 CoreFoundation 0x3712d340 -[CFXPreferencesPropertyListSourceSynchronizer initWithPropertyListSource:forLockedSynchronize:] + 232
6 CoreFoundation 0x371b4800 __79-[CFXPreferencesPropertyListSource synchronizeInBackgroundWithCompletionBlock:]_block_invoke_0 + 56
7 libdispatch.dylib 0x302e5c52 _dispatch_call_block_and_release + 6
8 libdispatch.dylib 0x302f0ca4 _dispatch_queue_drain + 268
9 libdispatch.dylib 0x302f0b12 _dispatch_queue_invoke$VARIANT$up + 30
10 libdispatch.dylib 0x302f1784 _dispatch_worker_thread2 + 208
11 libsystem_c.dylib 0x33a34df4 _pthread_wqthread + 288
12 libsystem_c.dylib 0x33a34cc8 start_wqthread + 0
答案 0 :(得分:1)
它在CFRetain
崩溃,所以我最好的猜测是你过度释放了一些键或某个值,或者你使用非对象作为键或值。
答案 1 :(得分:0)
我确实错了,我未能在属性设置器中正确保留self.string对象。
它关注哪个对象并不容易找到。调试器和僵尸对象有助于告诉确实有一个被引用的已发布对象,但是我无法找到调试器的对象是十六进制地址所指的对象。不是用gdb,也不是用lldb。 “po”告诉我“0x ......似乎没有指向有效的对象”。
最后,我通过以十六进制打印出来的地址找出了相关的对象:
NSLog( @"self.text=%@ self.text=(%p)", self.text,self.text);
并在日志和错误消息中看到该地址。