assign,copy,strong,weak,nonatomic的理解
舉個例子:
? ??NSString?*houseOfMM?= [[NSString?alloc]?initWithString:'MM的三室兩廳'];??
上面一段代碼會執(zhí)行以下兩個動作:??
1 在堆上分配一段內(nèi)存用來存儲@'?MM的三室兩廳?' ,比如:內(nèi)存地址為?0X1111??內(nèi)容為 '?MM的三室兩廳'?,??
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)存存放@'MM的三室兩廳',比如0X1122,內(nèi)容為@'MM的三室兩廳',同時會在棧上為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了啦。?
以上內(nèi)容參考原地址為:點這里
weak:由ARC引入的對象變量的屬性,比assign多了一個功能,對象消失后把指針置為nil,避免了野指針(不是null指針,是指向“垃圾”內(nèi)存(不可用的內(nèi)存)的指針)
nonatomic?
指出訪問器不是原子操作,而默認(rèn)地,訪問器是原子操作。這也就是說,在多線程環(huán)境下,解析的訪問器提供一個對屬性的安全訪問,從獲取器得到的返回值或者通過設(shè)置器設(shè)置的值可以一次完成,即便是別的線程也正在對其進行訪問。如果你不指定nonatomic,在自己管理內(nèi)存的環(huán)境中,解析的訪問器保留并自動釋放返回的值,如果指定了nonatomic,那么訪問器只是簡單地返回這個值。
轉(zhuǎn)載于:https://www.cnblogs.com/melodyzhy/p/4634446.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的assign,copy,strong,weak,nonatomic的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用C#检查硬盘是否是固态硬盘SSD
- 下一篇: android:由URL载入中Image