2013-11-09 27 views
1

表示我已經閱讀了很多關於在Objective-C的atomicnonatomic屬性主題,而據我所知,atomic意味着線程安全因此nonatomic更快。但主要的問題是我不明白什麼是線程,以及它們如何在代碼中表達。他們是種方法嗎?而且我還注意到,大部分屬性都是nonatomic,爲什麼?我看到線程可能會同時訪問屬性的setter或getter,這是如何實現的以及在運行時中如何表示?作爲一個新手程序員,我應該更喜歡atomic還是nonatomic線程如何在Objective-C

我已經搜索了很多關於這個問題,但沒有實際上已經回答了我的問題。

+2

「atomic」!=「線程安全」,比較http://stackoverflow.com/questions/588866/atomic-vs-nonatomic-properties。 –

+2

關於一般線程,可能首先閱讀Apple的[「線程編程指南」](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html)。 –

+1

這是一個困惑混亂成一個問題的很多;這就是爲什麼你找不到一個單一的答案。線程並不特定於ObjC或Cocoa。馬丁所連接的問題應該回答你所問的那些特定於已聲明屬性的部分。 –

回答

0

正如馬丁指出,人們普遍不依賴於atomic預選賽,因爲這不(一般)保證線程安全。關鍵的發現是,在該線程編程指南馬丁指出你的Synchronization節討論一個必須正確同步變化的變量。

所以,在回答你的問題,你應該普遍採用nonatomic(它比atomic快一點),但後來確定的各種同步技術(串行隊列,NSLockNSRecursiveLock@synchronized等)您更廣泛的線程安全系統設計的一部分。在某些情況下,atomic可能是解決方案的一部分(如線程編程指南Synchronization - Atomic Operations部分指出,原子操作是「上簡單數據類型的工作同步的一種簡單形式」),但你往往是處理對象,而不是簡單的數據類型,那麼atomic很可能是不夠的。順便說一句,如果您第一次潛入多線程代碼,我可能還建議您查看Concurrency Programming Guide,其中討論了一種稍微更簡單的方法來編寫多線程代碼,而無需進入NSThread的雜草。您可以使用分派隊列(Grand Central Dispatch)和操作隊列(NSOperationQueue)。

一些附加的引用:

關於該主題還有很多其他WWDC視頻,但這些可能是兩個很好的開始。

0

什麼是在所有的線程以及它們如何在代碼被表達。

嚴重的是,這是一個很大的話題。所以這裏有一些想法和最後一個問題的具體答案。實際上,並非所有的程序都需要併發性,所以我會說如果你在你的應用程序中沒有找到它的需求,你可以自由地放鬆。那麼,如果你的房產是atomic也沒關係。

另外作爲一個新手程序員,我更喜歡atomicnonatomic

作爲新手程序員,我會說他們作爲默認值。如果它們完全合成,編譯器會誠實地爲你合成一個原子吸氣劑和二次裝置。這沒有什麼不妥,當然你不應該「試圖讓它們變得更快」,直到你對應用程序進行剖析並發現這是一個問題。

如果您自己提供屬性的方法,您的屬性實際上是nonatomic,但我不確定標記它們是值得的。試着在可能被其他人重複使用的代碼中做到這一點。

在某些情況下,編譯器強制您聲明屬性爲nonatomic(將自定義setter與合成getter配對時,或者反之亦然)。那麼,在這些情況下,繼續並做到這一點。