系列:iOS開發(fā)-strong 、weak、copy 、assign 、retain

系列:iOS開發(fā)-strong 、weak、copy 、assign 、retain

無(wú)論是在iOS開發(fā)剛學(xué)習(xí)的時(shí)候,還是在日常的開發(fā)中,我們都需要?jiǎng)?chuàng)建的對(duì)象,對(duì)應(yīng)的我們就會(huì)有設(shè)置對(duì)象的類型的必要.
這個(gè)并不是說(shuō)設(shè)置了就完事了,為什么我們要用strong 、weak、copy 、assign 、retain等這些不同的修飾詞類定義對(duì)象呢?
說(shuō)白了就是為了內(nèi)存管理.
內(nèi)存管理是我們做開發(fā)的所必須要時(shí)刻關(guān)注的問題.
好在iOS開發(fā)經(jīng)過(guò)這么久的發(fā)展,已經(jīng)經(jīng)過(guò)了MRC的時(shí)代.現(xiàn)在的ARC時(shí)代系統(tǒng)自動(dòng)管理內(nèi)存,讓我們省掉了很多事情,但是我們?nèi)匀坏囊P(guān)注,我們需要在適當(dāng)?shù)牡胤绞褂眠m當(dāng)?shù)念愋?避免造成不必要的內(nèi)存消耗,或者循環(huán)引用等問題.

copy: 用于希望保持一份傳入值的拷貝,而不是值自身的情況,即把原來(lái)的對(duì)象完整的賦值到另外一地方,重新加載一內(nèi)存區(qū),一個(gè)地方變了不影響另一個(gè)地方的對(duì)象。
assign: 簡(jiǎn)單的直接賦值,相當(dāng)于說(shuō)兩個(gè)對(duì)象指向同個(gè)內(nèi)存區(qū),一個(gè)地方的變了,其他的也跟著改變。
retain:釋放舊的對(duì)象,將舊對(duì)象的值賦予輸入對(duì)象,再提高輸入對(duì)象的索引計(jì)數(shù) 為1
strong 用來(lái)修飾強(qiáng)引用的屬性;類似于對(duì)應(yīng)原來(lái)的retain或者copy
weak 用來(lái)修飾弱引用的屬性;類似于對(duì)應(yīng)原來(lái)的assign

copy與retain:
1、copy其實(shí)是建立了一個(gè)相同的對(duì)象,而retain不是;
2、copy是內(nèi)容拷貝,retain是指針拷貝;
3、copy是內(nèi)容的拷貝 ,對(duì)于像NSString,的確是這樣,但是如果copy的是一個(gè)NSArray呢?這時(shí)只是copy了指向array中相對(duì)應(yīng)元素的指針.這便是所謂的"淺復(fù)制".
4、copy的情況:NSString *newPt = [pt copy];
此時(shí)會(huì)在堆上重新開辟一段內(nèi)存存放@"abc" 比如0X1122 內(nèi)容為@"abc 同時(shí)會(huì)在棧上為newPt分配空間 比如地址:0Xaacc 內(nèi)容為0X1122 因此retainCount增加1供newPt來(lái)管理0X1122這段內(nèi)存;

assign與retain:
1、assign: 簡(jiǎn)單賦值,不更改索引計(jì)數(shù);
2、assign的情況:NSString *newPt = [pt assing];
此時(shí)newPt和pt完全相同 地址都是0Xaaaa 內(nèi)容為0X1111 即newPt只是pt的別名,對(duì)任何一個(gè)操作就等于對(duì)另一個(gè)操作, 因此retainCount不需要增加;
3、assign就是直接賦值;
4、retain使用了引用計(jì)數(shù),retain引起引用計(jì)數(shù)加1, release引起引用計(jì)數(shù)減1,當(dāng)引用計(jì)數(shù)為0時(shí),dealloc函數(shù)被調(diào)用,內(nèi)存被回收;
5、retain的情況:NSString *newPt = [pt retain];
此時(shí)newPt的地址不再為0Xaaaa,可能為0Xaabb 但是內(nèi)容依然為0X1111。 因此newPt 和 pt 都可以管理"abc"所在的內(nèi)存,因此 retainCount需要增加1 ;

assign與weak:
1、assign修飾的是基本數(shù)據(jù)類型,weak修飾的是對(duì)象類型
2、weak比assign多了一個(gè)功能就是當(dāng)屬性所指向的對(duì)象消失的時(shí)候(也就是內(nèi)存引用計(jì)數(shù)為0)會(huì)自動(dòng)賦值為nil,這樣再向weak修飾的屬性發(fā)送消息就不會(huì)導(dǎo)致野指針操作crash,而assign并不會(huì)賦值nil,也就是我們通常說(shuō)的野指針
3、在MRC時(shí)代,我們使用代理的時(shí)候是使用的assign,ARC的時(shí)代我們更傾向于你使用weak,

strong與weak:
1、strong與weak是由ARC新引入的對(duì)象變量屬性
ARC引入了新的對(duì)象的新生命周期限定,即零弱引用。如果零弱引用指向的對(duì)象被deallocated的話,零弱引用的對(duì)象會(huì)被自動(dòng)設(shè)置為nil。
2、通常我們手動(dòng)創(chuàng)建一個(gè)對(duì)象的時(shí)候我們會(huì)在vc中創(chuàng)建一個(gè)strong類型的對(duì)象,
表示當(dāng)前的vc的類的對(duì)象擁有這個(gè)小的對(duì)象,這樣其可以對(duì)該對(duì)象保持所有權(quán),該對(duì)象的修改乃至銷毀都由當(dāng)前的vc來(lái)決定,當(dāng)vc不存在的時(shí)候?qū)ο笠矔?huì)被釋放
3、我們會(huì)在使用xib或者storyboard的時(shí)候,拖出來(lái)的是一個(gè)weak類型的對(duì)象,事實(shí)上IBOutlet的屬性一般可以設(shè)為weak是因?yàn)樗呀?jīng)被view引用了,除非view被釋放,否則IBOutlet的屬性也不會(huì)被釋放,另外IBOutlet屬性的生命周期和view應(yīng)該是一致的,所以IBOutlet屬性一般設(shè)為weak。
4、在ARC的項(xiàng)目中,我們絕大部分看到的都是strong和weak修飾數(shù)據(jù)類型,我們更少的管理對(duì)象的內(nèi)存釋放問題.但是我們必須注意,比如一個(gè)NSTimer對(duì)象,通常我們使用strong,但是我們?nèi)绻褂貌划?dāng),我們就會(huì)造成其無(wú)法釋放,從而導(dǎo)致vc無(wú)法釋放的問題,這個(gè)你可以查找一些資料看看
5、在使用block的時(shí)候我們也會(huì)遇到循環(huán)引用導(dǎo)致的無(wú)法釋放的問題
例如vc中有一個(gè)block,在block中直接調(diào)用vc中的一個(gè)對(duì)象.就會(huì)造成循環(huán)引用.
我們需要學(xué)會(huì)使用弱指針 __weak 來(lái)解決,后續(xù)的博客會(huì)單獨(dú)介紹
6、strong強(qiáng)引用也就是我們通常所講的引用,其存亡直接決定了所指對(duì)象的存亡。如果不存在指向一個(gè)對(duì)象的引用,并且此對(duì)象不再顯示列表中,則此對(duì)象會(huì)被從內(nèi)存中釋放。
7、weak弱引用除了不決定對(duì)象的存亡外,其他與強(qiáng)引用相同。即使一個(gè)對(duì)象被持有無(wú)數(shù)個(gè)若引用,只要沒有強(qiáng)引用指向他,那麼其還是會(huì)被清除。沒辦法,還是 “強(qiáng)哥” 有面子。

strong與retain:
1、聲明屬性時(shí)用strong或者retain效果是一樣的(貌似更多開發(fā)者更傾向于用strong)
2、在聲明Block時(shí),使用strong和retain會(huì)有截然不同的效果。strong會(huì)等于copy,而retain竟然等于assign!
3、定義Block還是應(yīng)該用copy因?yàn)榉茿RC下不copy的Block會(huì)在棧中,ARC中的Block都會(huì)在堆上的。

暫時(shí)只想到這么多,后續(xù)會(huì)繼續(xù)添加

Demo地址:https://github.com/spicyShrimp/DEMO_OC

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容