37

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html说是

...应该通过禁用任何适当的控件来防止用户编辑该首选项。

NSUserDefaults 类是线程安全的。NSURL 和文件引用 URL 的持久性...

这个长时间的讨论说它不是

http://www.cocoabuilder.com/archive/cocoa/155227-nsuserdefaults-thread-safety.html

那么哪一个是对的呢?还有为什么意见不同。

4

2 回答 2

74

Apple iOS 5.1 和 OS X 10.7 文档说它是线程安全的;因此它是线程安全的。

于 2012-06-02T18:19:45.077 回答
47

谈到 10.10 和 iOS8,如果您查看实现,您会发现-[NSUserDefaults setObject:forKey:]正在调用__CFPreferencesSetAppValueWithContainer,最终将在+[CFPrefsSource withSourceForIdentifier:user:byHost:container:perform:]. 此方法使用 apthread_mutex_t来锁定对包含值的字典的访问。

所以 NSUserDefaults 是线程安全的。

于 2015-01-20T16:48:47.227 回答