[英]Objective-C properties' types
在Objective-C中聲明屬性時,可配置的自定義選項有哪些,它們定義了訪問器方法的行為方式?
例如,你可以擁有弱,強,只讀。
這是簡短的回答:
原子與非原子主要確保從合成的getter返回完整的值,並且完整的值由合成的setter寫入。
readwrite vs readonly確定合成屬性是否具有合成訪問器(readwrite具有setter並且是默認值,readonly不具有)。
assign vs weak vs retain vs copy確定合成訪問器如何與Objective-C內存管理方案交互。
而現在的答案很長:
原子v非原子
假設你是@synthesizing方法實現,原子與非原子會改變生成的代碼。 如果您正在編寫自己的setter / getter,則atomic / nonatomic / retain / assign / copy僅僅是建議性的。
使用原子,合成的setter / getter將確保始終從getter返回整個值或由setter設置,而不管任何其他線程上的setter活動。 也就是說,如果線程A位於getter的中間,而線程B調用setter,則實際可行的值 - 一個自動釋放的對象,很可能 - 將返回給A中的調用者。
在非原子,沒有這樣的保證。 因此,非原子比原子快得多。
原子不做的是對線程安全做出任何保證。 如果線程A與線程B同時調用getter並且C調用具有不同值的setter,則線程A可以獲得返回的三個值中的任何一個 - 在調用任何setter之前的值或者傳遞給setter的任一值在B和C中。同樣,對象最終可能會得到B或C的值,無法分辨。
確保數據完整性 - 多線程編程的主要挑戰之一 - 是通過其他方式實現的。
分配,弱,保留,復制
簡而言之,assign vs weak vs retain vs copy確定合成訪問器如何與Objective-C內存管理方案交互:
請記住,對創建的對象執行retain / strong(它會增加引用計數),而copy會創建一個新對象。 不過,區別在於您是要為對象添加另一個保留還是創建一個全新的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.