簡體   English   中英

Objective-C屬性的類型

[英]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內存管理方案交互:

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

請記住,對創建的對象執行retain / strong(它會增加引用計數),而copy會創建一個新對象。 不過,區別在於您是要為對象添加另一個保留還是創建一個全新的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM