首选项(NSUserDefaults)崩溃?
Posted
技术标签:
【中文标题】首选项(NSUserDefaults)崩溃?【英文标题】:Crash with preferences (NSUserDefaults)? 【发布时间】:2012-06-16 15:44:46 【问题描述】:我不时遇到这个崩溃,在我知道的一个不是我启动的线程中,提到了 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
【问题讨论】:
向我们展示一些访问 NSUserDefaults 的代码 【参考方案1】:它在CFRetain
上崩溃,所以我最好的猜测是你过度释放了一些键或值,或者你使用了非对象作为键或值。
【讨论】:
【参考方案2】:确实是我的错,我未能在属性设置器中正确保留 self.string 对象。
它所涉及的对象并不容易找到。调试器和僵尸对象有助于判断确实存在引用的已释放对象,但我无法通过调试器找出十六进制地址引用的对象是什么。不使用 gdb,也不使用 lldb。 “po”告诉我“0x ...似乎没有指向有效对象”。
最后我通过以十六进制打印出它的地址来找出它所涉及的对象:
NSLog( @"self.text=%@ self.text=(%p)", self.text,self.text);
并在日志和错误消息中看到该地址。
【讨论】:
尽管您的问题已解决,但我认为 setter 的原始版本没有任何问题。这是非常合法的,因为copy
在不可变对象的情况下与retain
具有相同的效果,因此即使newstr
指向与boolean_operator
相同的实例,它仍然不会被释放。请注意,您的问题可能仍然存在于其他地方。
对了,你为什么不用@synthesize
?
属性设置器不仅仅是一个属性设置器,上面是剥离的代码。当“boolean_operator”属性改变时,其他事情也会发生。
确实你是对的(tia),我在属性设置器的保留版本中也有一个错误,当我确定我做对了时会回来。显然我对复制/保留 NSString 对象的想法是不正确的。以上是关于首选项(NSUserDefaults)崩溃?的主要内容,如果未能解决你的问题,请参考以下文章
UIPickerView 不会显示从 NSUserDefaults 加载的数据
在 watchOS 2 中读取 NSUserDefaults(我知道 App Groups 不起作用)