OC中的修飾符

OC中的修飾符

首先從簡單到複雜大致分個類

  • 方法名修飾符:getter、setter
  • 原子性修飾符:atomic|、nonatomic
  • 讀寫性修飾符:read、write、readonly
  • set屬性修飾符:assign、retain、copy方法名修飾符

方法名修飾符
getter和setter屬性修飾符:用於設置自定義生成的getter和setter方法名,使用之後將不再使用系統默認的setter和getter方法名,用得不是很多,使用場景一般是對BOOL屬性設置該getter方法,比如 isGood 這樣用以方便判斷時使用。


原子修飾符
•atomic : 原子屬性,爲setter方法加鎖 (類似多線程中的互斥鎖) ,默認值 ,雖然線程安全,但需要消耗大量資源 。
•nonatomic : 非原子屬性,不爲setter方法加鎖 ,非線程安全,適合內存小的移動設備,讀寫性修飾符


讀寫性修飾符
• readwrite:表明這個屬性是可讀可寫的,系統爲我們生成這個屬性的setter和getter方法以及下劃線開頭的成員變量。
• readonly:表明這個屬性只能讀不能寫,系統只爲我們生成一個getter方法下劃線開頭的成員變量,不會創建setter方法

注意:
• 用readwrite自動生成setter和getter方法以及下劃線開頭的成員變量的時候,如果手動實現了setter和getter方法,那麼系統將不會生成下劃線開頭成員變量


setter相關修飾符
• retain:針對對象類型進行內存管理(非ARC)。當給對象類型使用此修飾符時,setter方法會先將舊的對象屬性release掉,再對新的對象進行一次賦值並進行一次retain操作
• copy:以前主要用在NSString類型和Block,建立一個索引計數爲1的對象,然後釋放舊對象。
• weak : 當一個對象被銷燬時,指針被清空,一般用在已經添加到父控件中的控件,因爲父控件會對子控件進行引用,也就是retain,所以自己的作用域結束之後不會被釋放。

Copy其實是建立了一個相同的對象,而retain不是:
比如一個NSString對象,地址爲0×1111,內容爲@”STR”
Copy到另外一個NSString之後,地址爲0×2222,內容相同,新的對象retain爲1,舊有對象沒有變化
retain到另外一個NSString之後,地址相同(建立一個指針,指針拷貝),內容當然相同,這個對象的retain值+1
也就是說,retain是指針拷貝,copy是內容拷貝。哇,比想象的簡單多了…
系統默認屬性是assign。retain是指針的複製,copy是內容的複製

用copy修飾字符串時
在setter方法中會判斷,傳入的字符串,是否是可變的,如果是可變的就分配新的內存再賦值,如果是不可變的就直接賦值地址,而實際上開發中其實大量使用的是不可變的字符串,所以最好使用 strong 修飾字符串,可以提升性能(減少一次判斷)。

用copy修飾Block時
首先要知道Block在非ARC和ARC下的區別,
非ARC環境下:block訪問外部局部變量,block存放棧裏面,只要block訪問變量,而且是整個app都存在的變量,那麼肯定在全局區 在非ARC中。不能使用retain引用block,因爲不會放在堆裏面,在非ARC中只能使用copy,纔會把block放在堆裏面。
ARC環境下: 只要block訪問了外部局部變量,block就會存放到堆裏面,可以使用strong去引用,因爲本身就已經是存放在堆區了,也可以用copy,但是用stong性能更好
做個小總結(只說ARC環境下的) 用strong修飾OC對象以及NSString和Block , 沒添加到父控件上的控件,用weak修飾已經被添加到父控件上的控件,以及代理對象,用assign基本數據類型、枚舉、結構體(非OC對象) class類型

用copy修飾一種情況下的NSString
不確定賦值過程中用的是可變還是不可變字符串


 **屬性修飾符簡單總結:**

基本數據類型用assign,對象用strong,代理和UI控件用weak,字符串用copy!

1、assgin 適用於對基本數據類型(int,float等)的簡單賦值操作

2strong 這個屬性特質表示一種擁有的關係,setter方法設置新值的時候會先保留屬性的新值,然後釋放舊值,最後將新值賦值給屬性

3weak   表示一種非擁有的關係。setter方法設置新值的時候不會先保留屬性的新值,也不會釋放舊值,只是將新值賦值給屬性,與assign不同的是該內存管理特性會在屬性所指的對象銷燬時,將屬性置爲nil,更加安全

4、unsafe_unretained  與assign類型類似。適用於"對象"類型的賦值,表達的是一種非擁有(unretained)的關係,當屬性所指的對象被銷燬時,屬性值不會自動被自動清空;

5、copy 如字面意思,該特質的setter方法不會保留新值,而是將其拷貝,當屬性類型爲NSString時候,可以用這個特質來確保屬性的值不會被其他對象修改。
     因爲傳遞給setter方法的新值有可能是一個指向NSMutableString類型的實例,若是不拷貝字符串,那麼該字符串有可能在對象不知情的情況下被其他對象修改,導致意外的結果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章