2012-09-12 109 views
9

當在Objective-C中聲明屬性時,可用於配置的自定義選項是什麼,它定義了訪問器方法的行爲方式?Objective-C屬性的類型

例如,你可以弱,強,只讀。

+2

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html – sosborn

+0

@sosborn所以你可以在括號內有多個選項,用逗號隔開? – makaed

+0

@makaed是的,但只有一個屬於內存管理 –

回答

39

這裏的答案很簡單:

原子VS非原子主要是確保完成值從合成干將返回和完整值由合成制定者寫的。

讀寫VS只讀確定合成屬性是否具有合成訪問者或不(讀寫具有setter和是默認的,只讀沒有)。

指定vs弱vs保留vs複製確定合成訪問器如何與Objective-C內存管理方案交互。

現在對於長回答:

原子v非原子

假設你@synthesizing的方法實現,原子主場迎戰非原子的變化生成的代碼。如果你正在編寫你自己的setter/getters,atomic/nonatomic/retain/assign/copy只是顧問。

使用原子,合成的setter/getter將確保整個值總是從getter返回或由setter設置,而不管任何其他線程上的setter活動。也就是說,如果線程A位於獲取者的中間,而線程B調用setter,則實際可行值(最有可能的自動釋放對象)將返回給調用者A.

在非原子中,沒有這樣的保證。因此,非原子比原子快得多。

什麼原子不能做的是對線程安全做出任何保證。如果線程A在線程B和C同時調用getter時使用不同的值調用setter,則線程A可能會返回三個返回值中的任何一個值 - 在調用任何setter之前的值或者傳入setters的任一值在B和C中。同樣,該對象可能以B或C的值結束,無法說明。

確保數據完整性 - 多線程編程的主要挑戰之一 - 是通過其他方式實現的。

分配,弱,保留,複製

概括地說,分配VS弱VS保留VS拷貝確定所合成的訪問器如何與目標C內存管理方案進行交互:

  • 分配是默認值,只是執行變量賦值。它沒有聲明所有權,因此如果沒有其他人通過保留或其他方式自己聲明所有權,那麼屬性指針所指向的對象可能隨時消失。在ARC環境中,assign不能確保指針不會晃動,這意味着如果另一端的對象已被釋放,則指針可能最終指向垃圾。
  • weak與assign相同,只不過它會將導致釋放對象的指針置零以阻止它們懸空。弱點僅在ARC環境中可用。
  • retain指定應該發送的新值 - 在賦值時保留並且舊值發送釋放。保留也被認爲是強大的。
  • copy指定應該發送的新值-copy將賦值和舊值發送發佈。複製通常用於屬性類型具有可變表親(NSArray/NSMutableArray)的屬性,以防止其他人以可變版本發送並更改它們/讓它們在背後更改等等。

請記住,保留/ strong是在創建的對象上完成的(它增加了引用計數),而copy創建了一個新的對象。所不同的是,你是否想要添加另一個保留到對象或創建一個全新的對象。

+0

Readwrite vs Readonly不會____阻止合成getter/setter。它可以防止他人通過分發像糖果一樣的錯誤來獲取價值。也忘了_weak_,這些零指針可以防止它們晃來晃去。我猜你沒有使用_retain_而是使用_strong_來思考ARC。 – Metabble

+0

@Metabble如果我正確理解你,你已經投下我的答案,不是因爲它不正確或無益,而是因爲我沒有給出一個懶惰的,不具體的問題的全面答案?此外,您不必編輯我的答案或添加您自己的答案以填補空白,而是留下了一條尖銳的評論,指出我的疏忽。那麼,謝謝你提醒我爲什麼我停止參加這個網站。我希望你能在六個月內再次忘記時幫助我。 – PengOne

+0

對不起,如果你把我的評論當作嗤之以鼻的話,因爲我不打算以這種方式表達意見,並認爲你的回答非常有幫助。我沒有編輯你的答案,因爲我正在回答其他人的中間,如果我記得正確的話,並在輸入後立即回到對話中。另外,我不知道是誰投票否決了你的答案,但我幾乎肯定它不是我。我不會輕視,也絕不會降低近乎完美的,有用的答案! :) – Metabble