2012-06-02 57 views
28

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html說,這是NSUserDefault線程安全嗎?

...應防止用戶通過禁用任何 適當控制編輯該偏好。

NSUserDefaults類是線程安全的。 NSURL的持久性和 文件參考網址...

這種長時間的討論說,這是不是

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

那麼,哪一個是正確的?還有爲什麼有差異的意見。

+3

請記住,您發佈的鏈接來自2006年的討論,所以完全有可能NSUserDefaults已成爲線程安全的。 – UIAdam

+0

任何人都知道更多的歷史?也許NSUserDefaults是線程安全的,但它的單例不是。那種事。 –

+0

除非你有最近**的證據表明否則,否則我猜文檔可能是正確的,說這個類是線程安全的。無論是自定義實例還是「standardUserDefaults」實例(我認爲這就是「singleton」的意思),它們都是同一類的最終實例,並且不是線程安全的。 – UIAdam

回答

56

Apple iOS 5.1和OS X 10.7文檔說它是線程安全的;因此它是線程安全的。

+0

以前是不是保存? –

+0

討論如何? – Tieme

+2

看看討論的日期。它非常過時。 –

26

說到10.10和iOS8,如果你正在尋找實施,你會發現-[NSUserDefaults setObject:forKey:]__CFPreferencesSetAppValueWithContainer,最終將在+[CFPrefsSource withSourceForIdentifier:user:byHost:container:perform:]結束。此方法使用pthread_mutex_t來鎖定對包含值的字典的訪問。

所以NSUserDefaults是線程安全的。

+1

如何看到執行呢? –

+0

使用Hopper Disassembler(或Xcode)讀取程序集 – McZonk