1. 程式人生 > >ios修飾詞總結

ios修飾詞總結

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

assign ( ARC/MRC )

整型/浮點型等資料型別都用這個詞修飾 .如果沒有使用 weak strong retain copy 修飾 , 那麼預設就是使用 assign 了.assign也可以修飾物件 , 只是物件的計數器不會+1

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 .