屬性設置@property之retain,assign,weak,strong,copy


1.assign

assign只是簡單賦值,不更改索引計數,適用於基礎數據類型 (例如NSInteger,CGFloat)和C數據類型(int, float, double, char, 等)       

2.copy

copy用來建立一個索引計數為1的對象,然后釋放舊對象, 常用語NSString ,指在賦值時使用傳入值的一份拷貝。

3.retain

retain用來釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1

對其他NSObject和其子類,對參數進行release舊值,再retain新值。    

retain的語法為:

- (void)setName:(NSString *)newName { 
  if (name != newName) { 
       [name release]; 
       name = [newName retain]; 
    //注意: 把對象添加到數組中時,引用計數將增加對象的引用次數+1。
       // name’s retain count has been bumped up by 1 
    } 
}

4.copy與retain:

Copy其實是建立了一個相同的對象,而retain不是:

比如一個NSString對象,地址為0×1211,內容為@"str1",Copy到另外一個NSString之后,地址為0×2211,內容相同,新的對象retain為1,舊有對象沒有變化,retain到另外一個NSString之后,地址相同(建立一個指針,指針拷貝),內容當然相同,同時建立一個指針指向原來的NSString,這個對象的retain值+1,可以說,retain是指針拷貝,而copy是內容拷貝。

同樣理解,retain的set方法是淺復制,而copy的set方法是深復制。

5.assign與retain:

assign就是直接賦值,從而可能引起1中的問題,當數據為int, float等原生類型時,可以使用assign。retain使用了引用計數,retain引起引用計數加1, release引起引用計數減1,當引用計數為0時,dealloc函數被調用,內存被回收。

6.strong和weak

6.1.strong和weak原理

兩者都是對象修飾詞 ,用來修飾變量和指針,strong表示強指針,weak表示弱指針。

假設創建person對象,此時計數器加一,release之后,計數器減1

ARC中使用 強指針和弱指針來判斷是否銷毀

對象創建以后默認情況下全是強指針 ,然而在創建對象的表達式前加上_weak修飾的時候表示對象為弱指針。

內存中給person創建內存,指針指向person對象,arc判斷原則,只要沒有任何強指針指向對象,對象就會被銷毀。使用strong和weak主要是防止出現內存泄露,死循環,還有就是節省內存。

6.2 視圖中插入控件為什么用weak?

      控制器里拖入控件的時候系統默認為weak,此時就會有人產生疑問,以為weak為弱指針,此時創建之后會很快會消除,這樣會不會造成添加的控件也消除?然而並不會,因為控制器里有view和相應控件,view的父類UIview里有一個數組subview,將button創建在view上, view的subview就會有指針指向button,此時button繼承自UIButton,即存在指針指向UIButton,所以weak並不會造成實質影響。沒有button此時按鈕照樣起作用,因為只要view存在,則其button就存在,所以此時強弱指針並不會對程序造成影響,用弱指針的目的是為了及時清空內存,提高性能。

6.3 代理控件用weak,代理為什么用weak

      代理方法如delegate,datasource使用的都是assign,為弱指針,比如在一個創建一個tableview,此時tableview指向UITableView,如果設置delegate方法,則存在一個指針指UITableviewController,然而tableview創建之后就在UITableviewController內,控制器擁有控件,此時,如果delegate如果使用強指針,則就會造成死循環。imageview,scrollview,collectionview同樣的道理。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM