iOS開發知識點:理解assign,copy,retain變strong

舉個例子:

    NSString *houseOfMM = [[NSString allocinitWithString:'裝梵幾的三室兩廳'];  

上面一段代碼會執行以下兩個動作:  
1 在堆上分配一段內存用來存儲@' 裝梵幾的三室兩廳 ' ,比如:內存地址爲 0X1111  內容爲 ' 裝梵幾的三室兩廳' ,  
2 在棧上分配一段內存用來存儲 houseForWife ,比如:地址爲 0XAAAA  內容自然爲 0X1111    


下面分別看下(assign,retain,copy):  
1.assign的情況: NSString  * myHouse  = [ houseOfMM   assign ];  
此時 myHouse  houseOfMM 完全相同,地址都是 0XAAAA  ,內容爲 0X1111  ,即 myHouse 只是 houseOfMM 的別名,對任何一個操作就等於對另一個操作。因此 retainCount 不需要增加.(同進同出,關係好,一把鑰匙,給我拿着)  
2.retain的情況: NSString  *  myHouse  = [ houseOfMM   retain ];  
此時 myHouse 的地址不再爲 0XAAAA ,可能爲 0XAABB ,但是內容依然爲 0X1111 .因此 myHouse  houseOfMM都可以管理' 裝梵幾的三室兩廳 '所在的內存。因此  retainCount 需要增加1.(有些獨立,各自進出,兩把鑰匙)  
3.copy的情況: NSString  *  myHouse  = [ houseOfMM   copy ];  

此時會在堆上重新開闢一段內存存放@'裝梵幾的三室兩廳',比如0X1122,內容爲@'裝梵幾的三室兩廳',同時會在棧上爲myHouse分配空間,比如地址:0XAACC,內容爲0X1122,因此retainCount增加1供myHouse來管理0X1122這段內存.(兩套@'裝梵幾的三室兩廳',條件好,分居了,房子一人一套,所以鑰匙一人一把。) 



什麼時候用assign,當然是破房子,簡裝的房子拉
基礎類型(簡單類型,原子類型):NSInteger,CGPoint,CGFloat,C數據類型(int,float,double,char等)


什麼時候用copy
含有可深拷貝的mutable子類的類,如NSArrayNSSetNSDictionaryNSData的,NSCharacterSetNSIndexSetNSString
(可深度拷貝的房子)
但是NSMutableArray這樣的不可以,Mutable的不能用copy,不然初始化會有問題。切記

什麼時候用retain
其他NSObject和其子類對象好嘛 (大多數)


ARC中的strong相當於非ARC中的retain,ARC來了以後多搞一把鑰匙就strong了啦。 

抄襲:http://wenku.baidu.com/view/ab6ed804bed5b9f3f90f1c7d.html 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章