assign,copy,retain,strong,weak

strong&weak

http://www.lxweimin.com/p/2a2e1f0849ef

assign,retain&copy

舉個例子:

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

上面一段代碼會執(zhí)行以下兩個動作:

1 在堆上分配一段內(nèi)存用來存儲@' 裝梵幾的三室兩廳 ' ,比如:內(nèi)存地址為 0X1111? 內(nèi)容為 ' 裝梵幾的三室兩廳' ,

2 在棧上分配一段內(nèi)存用來存儲 houseForWife ,比如:地址為 0XAAAA? 內(nèi)容自然為 0X1111

下面分別看下(assign,retain,copy):

1.assign的情況: NSString? * myHouse? = [ houseOfMM? assign ];

此時 myHouse 和 houseOfMM 完全相同,地址都是 0XAAAA? ,內(nèi)容為 0X1111? ,即 myHouse 只是 houseOfMM 的別名,對任何一個操作就等于對另一個操作。因此 retainCount 不需要增加.(同進同出,關(guān)系好,一把鑰匙,給我拿著)

2.retain的情況: NSString? *? myHouse? = [ houseOfMM? retain ];

此時 myHouse 的地址不再為 0XAAAA ,可能為 0XAABB ,但是內(nèi)容依然為 0X1111 .因此 myHouse 和 houseOfMM 都可以管理' 裝梵幾的三室兩廳 '所在的內(nèi)存。因此? retainCount 需要增加1.(有些獨立,各自進出,兩把鑰匙)

3.copy的情況: NSString? *? myHouse? = [ houseOfMM? copy ];

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

什么時候用assign,當(dāng)然是破房子,簡裝的房子拉

基礎(chǔ)類型(簡單類型,原子類型):NSInteger,CGPoint,CGFloat,C數(shù)據(jù)類型(int,float,double,char等)

什么時候用copy

含有可深拷貝的mutable子類的類,如NSArray,NSSet,NSDictionary,NSData的,NSCharacterSet,NSIndexSet,NSString

(可深度拷貝的房子)

但是NSMutableArray這樣的不可以,Mutable的不能用copy,不然初始化會有問題。切記

什么時候用retain

其他NSObject和其子類對象好嘛 (大多數(shù))

ARC中的strong相當(dāng)于非ARC中的retain,ARC來了以后多搞一把鑰匙就strong了啦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容