2012-06-02 2 views
28

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html говорит, что этоБезопасна ли NSUserDefault?

... следует запретить пользователь редактирования, что предпочтение при отключении каких-либо соответствующих элементов управления.

Класс NSUserDefaults является потокобезопасным. Постоянство NSURL и ссылки файл URL-адреса ...

Это длинное обсуждение говорит не

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

Так кто прав? И почему разница в мнениях.

+3

Имейте в виду, что обсуждение, с которым вы разместили ссылку с 2006 года, вполне возможно, что NSUserDefaults с тех пор становится потокобезопасным. – UIAdam

+0

Кто-нибудь знает больше об истории? Возможно, NSUserDefaults является потокобезопасным, но это singleton is not. Такого рода вещи. –

+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 (или Xcode) – McZonk