property中的屬性關鍵字

2021-09-24 19:22:21 字數 3211 閱讀 2915

arc下,不顯式指定任何屬性關鍵字時,預設的關鍵字都有哪些?

atomicreadwritestrong(物件)、assgin(基本資料型別)。

具體比較分析:

1、atomic與nonatomic

atomic:預設是有該屬性的,這個屬性是為了保證程式在多執行緒情況下,編譯器會自動生成一些加鎖**,避免該變數的讀寫不同步的問題,提供多執行緒安全。

nonatomic:如果該物件無需考慮多執行緒的情況,加入這個屬性,這樣會讓編譯器少生成一些加鎖**,禁止多執行緒,變數保護,提高效能和效率。

注:atomic是objc使用的一種執行緒保護技術,基本上來講是防止在寫未完成的時候另乙個執行緒讀取,造成的資料錯誤。而這種機制是非常耗費系統資源的,所以iphone這種小型裝置上,如果沒有使用多執行緒間的通訊程式設計,那麼nonatomic是乙個非常好的選擇。而ios開發中,普遍使用nonatomic也是基於效能這一點。

擴充套件:自旋鎖和互斥鎖

共同點: 都可以鎖定一段**。同一時間,只有執行緒能夠執行這段鎖定的**。

區別:互斥鎖,在鎖定的時候,其他執行緒會睡眠,等待條件滿足,再喚醒。

自旋鎖,在鎖定的時候,其他的執行緒會做死迴圈,一直等待這條件滿足,一旦條件滿足,立馬去執行,少了乙個喚醒過程。

2、readwrite與readonly

readwrite:這個屬性是預設的情況,會自動為你生成訪問器。

readonly:只生成getter,不會生成setter方法。

注:readwrite、readonly這兩個屬性的真正價值,不是提供成員變數的訪問介面,而是控制成員變數的訪問許可權。

3、strong與weak

strong:強引用,也是我們通常說的引用,其存亡直接決定了所指向物件的存亡,當強引用指向了某個物件,那便擁有了這個物件。如果不存在指向乙個物件的引用,並且此物件不再使用,則物件就會被從記憶體中釋放掉。預設所有例項變數和區域性變數都是strong指標。

weak:弱引用,不決定物件的存亡,只是單純的引用了某個物件但是並不擁有該物件。即使乙個物件被持有無數個弱引用,只要沒有強引用指向它,那麼還是會被清除。

注:strong與retain功能相似;weak與assign相似,只是當物件消失後weak會自動把指標置為nil,避免了野指標的產生,因而weak屬性就不需要在dealloc中置nil了。

4、assign和weak

weak 此特質表明該屬性定義了一種「非擁有關係」 (nonowning relationship)。為這種屬性設定新值時,設定方法既不保留新值,也不釋放舊值。此特質同assign類似, 然而在屬性所指的物件遭到摧毀時,屬性值也會清空(nil out)。 而 assign 的「設定方法」只會執行針對「純量型別」 (scalar type,例如 cgfloat 或 nslnteger 等)的簡單賦值操作。

weak 必須用於 oc 物件,而assign 可以用非 oc 物件。

使用assign: 對基礎資料型別 (nsinteger,cgfloat)和c資料型別(int, float, double, char, 等等)

注:1.修飾變數型別的區別

weak只可以修飾物件。如果修飾基本資料型別,編譯器會報錯-「property with 『weak』 attribute must be of object type」。

assign可修飾物件,和基本資料型別。當需要修飾物件型別時,mrc時代使用unsafe_unretained。當然,unsafe_unretained也可能產生野指標,所以它名字是"unsafe_」。

2.是否產生野指標的區別

weak不會產生野指標問題。因為weak修飾的物件釋放後(引用計數器值為0),指標會自動被置nil,之後再向該物件發訊息也不會崩潰。 weak是安全的。

assign如果修飾物件,會產生野指標問題;如果修飾基本資料型別則是安全的。修飾的物件釋放後,指標不會自動被置空,此時向物件發訊息會崩潰。

assign適用於基本資料型別如int,float,struct等值型別,不適用於引用型別。因為值型別會被放入棧中,遵循先進後出原則,由系統負責管理棧記憶體。而引用型別會被放入堆中,需要我們自己手動管理記憶體或通過arc管理。

weak適用於delegate和block等引用型別,不會導致野指標問題,也不會迴圈引用,非常安全。

5、copy和retain

assgin:預設型別,setter方法直接賦值,不進行任何的retain操作,不改變引用計數。一般用來處理基本資料型別。

retain:釋放舊的物件(release),將舊物件的值賦給新物件,再令新物件引用計數為1。可理解為指標拷貝。

copy:與retain的流程一樣,先對舊的值release,再copy出新的物件,引用計數為1,為了減少對上下文的依賴而引入的機制。可以理解為內容的拷貝,也就意味著內容被copy後,記憶體中會有兩個儲存空間儲存同樣的內容。

對copy屬性要特別注意:被定義有copy屬性的物件必須要 符合nscopying協議,必須實現- (id)copywithzone:(nszone *)zone方法。對copy屬性要特別注意:被定義有copy屬性的物件必須要 符合nscopying協議,必須實現- (id)copywithzone:(nszone *)zone方法。

對於不可變物件來說,copy為淺拷貝,和strong一樣,均增加了源物件的引用計數;而對於可變物件來說,copy為深拷貝,我們知道深拷貝為內容拷貝,所以如果改變源物件時,宣告成copy的屬性並不會跟著變化。而由於宣告成strong的屬性只是增加源物件的引用計數,依舊指向源物件,故會同步改變。所以,當我們宣告屬性時,如果不希望它因為源物件(源物件為可變物件時)的改變而改變,則用copy修飾。

擴充套件深拷貝與淺拷貝

深拷貝就是內容拷貝,淺拷貝就是指標拷貝

其實copy本質是用來做深拷貝的,但是修飾不可變的陣列時,由於深拷貝出來也不能做新增或刪除操作,為了節約資源,直接淺拷貝了。

深拷貝就是拷貝出和原來僅僅是值一樣,但是記憶體位址完全不一樣的新的物件,建立後和原物件沒有任何關係。

淺拷貝就是拷貝指向原來物件的指標,使原物件的引用計數+1,可以理解為建立了乙個指向原物件的新指標而已,並沒有建立乙個全新的物件。

[immutableobject copy] //淺複製

[immutableobject mutablecopy] //單層深複製

[mutableobject copy] //單層深複製

[mutableobject mutablecopy] //單層深複製

property中的關鍵字說明

以前讀書看到 property理解都不深刻,只是簡單的認為幫我們做了setter和getter。對其中的幾個關鍵字理解都不到位,今天被坑了,故來標記一下。atomic執行緒保護的,預設。意思是在多執行緒程式設計中,對該屬性的訪問具有原子性,不會被cpu時間片切分。nonatomic執行緒不保護的,相...

iOS 的 property中的關鍵字

所有者屬性 我們先來看看與所有權有關係的屬性,關鍵字間的對應關係。屬性值關鍵字 所有權strong strong 有weak weak 無unsafe unretained unsafe unretained 無copy strong 有assign unsafe unretained 無retai...

python關鍵字之 property

學習 python 的時候,經常遇見 property 關鍵字,有時候讓我有點疑惑,所以寫下這篇部落格來記錄它。在繫結屬性時,如果我們直接把屬性暴露出去,雖然寫起來很簡單,但是,沒辦法檢查引數,導致可以隨便更改屬性 舉個例子 class celsius def init self,temperatu...