ios修飾詞總結

2021-08-18 23:18:12 字數 2211 閱讀 9000

ios總共有這些修飾詞:assign、weak、strong、retain、copy、nonatomic、atomic、readonly、readwrite

assign ( arc/mrc )

weak ( arc )(物件)

弱指標是針對物件的修飾詞 , 就是說它不能修飾基本資料型別(int float) .weak 修飾的引用計數器不會+1 , 也就是直接賦值 .

weak 和 assign的區別 同樣修飾物件 同樣引用計數不+1

assign與weak,它們都是弱引用宣告型別,但是他們是有區別的。

1.用weak宣告的變數在棧中就會自動清空,賦值為nil。

2.用assign宣告的變數在棧中可能不會自動賦值為nil,就會造成野指標錯誤!

以delegate的宣告為例,在mrc中多delegate宣告使用的是assign,這是為了不造成迴圈引用,這時,我們需要在-dealloc方法中寫上 self.delegate = nil,以免造成delegate的野指標錯誤。當然,在arc中,只需要用weak宣告delegate,就會自動釋放了。

strong ( arc )(物件)

1.直接賦值並且物件的引用計數器 +1 .

2.在 arc 裡替代了 retain 的作用 .

retain ( mrc )

1.release 舊物件( 舊物件計數器 -1 ) , retain 新物件( 新物件計數器 +1 ) , 然後指向新物件 .

copy:1.copy 在 mrc 時是這樣做的 release 舊物件( 舊物件的引用計數器 -1 ) , copy 新物件( 新物件的引用計數器 +1 ) , 然後指向新物件 .(新物件是指最終指向的那個物件,不管深拷貝還是淺拷貝)

2.copy 在 arc 時是這麼幹的 copy 新物件( 新物件的引用計數器 +1 ) , 然後指向新物件 .

3.copy的使用:

修飾的屬性本身要不可變的。例如 nsmutablearray 採用 copy 修飾 ,  因為nsmutablearray的物件在copy 過後就會變成nsarray。如果需要copy nsmutablearray物件,用:mutablecopy。.

nonatomic ( arc/mrc )

1.不對set方法加同步鎖 .

2.效能好

3.執行緒不安全

atomic ( arc/mrc )

1.原子屬性就是對生成的 set 方法加互斥鎖 @synchronized(鎖物件) .

2.需要消耗系統資源 .

3.互斥鎖是利用執行緒同步實現的 , 意在保證同一時間只有乙個執行緒呼叫 set 方法 .

nonatomic 和 atomic 的介紹和區別

atomicity(原子性):我把原子性理解成執行緒對屬性的單一執行。

例如,當兩條執行緒同時執行乙個屬性的set方法的時候,如果不具有原子性(也就是宣告屬性時使用了nonatimic),那麼就可能出現當a執行緒正在改寫某屬性值的時候,b執行緒也許會突然闖入,把尚未修改好的屬性值讀取出來。發生這種情況時,執行緒讀取到的屬性值肯能不對。

2. 保證atomicity真的就執行緒安全了嗎?為什麼日常宣告都用的是nonatomic呢?

保證atomicity並非也是執行緒安全的,如果需要保證安全,需要跟深層次的執行緒鎖定機制。使用同步鎖在ios中開銷比較大,會給程式帶來效能上的問題。

3. 為什麼atomicity也不能保證執行緒安全?

例如:當使用atomic時,仍然可能出現執行緒錯誤:當執行緒a進行set操作,這時其他執行緒的get或者set操作會因為等該操作而等待。當a執行緒的set操作結束後,b執行緒進行set操作,然後當a執行緒需要get操作時,卻獲得了在b執行緒的值,這就破壞了執行緒安全,如果有c執行緒在a執行緒get操作之前release了該屬性,那麼還會導致程式崩潰。所以僅僅使用atomic並不會使得執行緒安全,我們還是要為執行緒新增lock來確保執行緒的安全。

readonly (唯讀)

1.讓 xcode 只生成get方法 .

2.不想把暴露的屬性被人隨便替換時 , 可以使用 .

readwrite (讀寫)(預設)

1.讓 xcode 生成get/set方法 .

2.不用 readonly 修飾時 , 預設就是 readwrite .

常用Java修飾詞

1.public 使用物件 類 介面 成員 介紹 無論它所處在的包定義在哪,該類 介面 成員 都是可訪問的 2.private 使用物件 成員 介紹 成員只可以在定義它的類中被訪問 3.static 使用物件 類 方法 字段 初始化函式 介紹 成名為static的內部類是乙個頂級類,它和包含類的成員...

關於修飾詞const

1.const修飾的唯讀變數必須在定義的同時初始化 因為如果沒有被賦初值,那麼變數被編譯器分配了乙個空間,並且賦給預設的乙個值,一般是很大的乙個負數,當我們再次給這個const變數賦值的時候就會出現錯誤,這個變數是唯讀的,一旦被賦值了就不能再改變了。2.case後面不可以是const修飾的唯讀變數,...

Java訪問許可權修飾詞

從訪問許可權的大小可以由大到小排列為public,protected,包訪問許可權,以private.包訪問許可權 即預設訪問許可權,沒有任何關鍵字,又是也表示friendly。在乙個包中,如果乙個物件前面沒有任何許可權修飾符的話,就預設為包許可權修飾符。包預設許可權的範圍是包內的任意乙個類中都可以...