2012-06-02 30 views
28

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html nói nó làChuỗi NSUserDefault có an toàn không?

... nên ngăn chặn người dùng chỉnh sửa sở thích rằng bằng cách vô hiệu hóa bất kỳ điều khiển thích hợp.

NSUserMặc định là lớp an toàn. Persistence của NSURL và tập tin tài liệu tham khảo URL ...

cuộc thảo luận dài này cho biết nó không phải là

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

Vì vậy, cái nào là đúng? Ngoài ra tại sao sự khác biệt của ý kiến.

+3

Hãy nhớ rằng cuộc thảo luận bạn đã đăng liên kết đến từ năm 2006, vì vậy hoàn toàn có thể NSUserDefaults đã trở thành chủ đề an toàn kể từ đó. – UIAdam

+0

Có ai biết thêm về lịch sử không? Có lẽ NSUserDefaults là thread an toàn nhưng nó là singleton thì không. Đó là một cách nghĩ. –

+0

Trừ khi bạn có ** gần đây ** bằng chứng để đề xuất khác, tôi đoán các tài liệu có lẽ là chính xác trong nói rằng lớp là thread an toàn. Cho dù đó là một cá thể tùy chỉnh hay cá thể 'standardUserDefaults' (tôi cho rằng đó là ý nghĩa của" singleton "), tất cả chúng đều là trường hợp của cùng một lớp và sẽ là luồng an toàn hay không. – UIAdam

Trả lời

56

Tài liệu Apple iOS 5.1 và OS X 10.7 nói rằng đó là an toàn chỉ chủ đề; do đó nó là an toàn thread.

+0

Trước đây nó không được lưu? –

+0

còn các cuộc thảo luận thì sao? – Tieme

+2

nhìn vào ngày thảo luận. Nó là hết sức lỗi thời. –

26

Nói cho 10.10 và iOS8 nếu bạn xem xét triển khai, bạn sẽ thấy rằng -[NSUserDefaults setObject:forKey:] đang gọi __CFPreferencesSetAppValueWithContainer, cuối cùng sẽ kết thúc bằng +[CFPrefsSource withSourceForIdentifier:user:byHost:container:perform:]. Phương pháp này đang sử dụng pthread_mutex_t để khóa quyền truy cập vào từ điển chứa các giá trị.

Vì vậy, NSUserDefaults là chủ đề an toàn.

+1

cách xem triển khai không? –

+0

Đọc lắp ráp bằng cách sử dụng Bộ tách rời Hopper (hoặc Xcode) – McZonk