- weak 修飾的指針變量气笙,在指向的內(nèi)存地址銷(xiāo)毀后次企,會(huì)在 Runtime 的機(jī)制下,自動(dòng)置為 nil潜圃。
- _Unsafe_Unretain不會(huì)置為 nil缸棵,容易出現(xiàn) 懸垂指針,發(fā)生崩潰谭期。但是 _Unsafe_Unretain 比 __weak 效率高堵第。
1.assign 與weak區(qū)別
assign適用于基本數(shù)據(jù)類(lèi)型吧凉,weak是適用于NSObject對(duì)象,并且是一個(gè)弱引用踏志。
assign其實(shí)也可以用來(lái)修飾對(duì)象阀捅。那么我們?yōu)槭裁床挥盟揎棇?duì)象呢?因?yàn)楸籥ssign修飾的對(duì)象(一般編譯的時(shí)候會(huì)產(chǎn)生警告:Assigning retained object to unsafe property; object will be released after assignment)在釋放之后针余,指針的地址還是存在的饲鄙,也就是說(shuō)指針并沒(méi)有被置為nil,造成野指針圆雁。對(duì)象一般分配在堆上的某塊內(nèi)存忍级,如果在后續(xù)的內(nèi)存分配中,剛好分到了這塊地址伪朽,程序就會(huì)崩潰掉轴咱。
那為什么可以用assign修飾基本數(shù)據(jù)類(lèi)型?因?yàn)榛A(chǔ)數(shù)據(jù)類(lèi)型一般分配在棧上烈涮,棧的內(nèi)存會(huì)由系統(tǒng)自己自動(dòng)處理朴肺,不會(huì)造成野指針。
weak修飾的對(duì)象在釋放之后坚洽,指針地址會(huì)被置為nil戈稿。所以現(xiàn)在一般弱引用就是用weak。weak使用場(chǎng)景:
在ARC下,在有可能出現(xiàn)循環(huán)引用的時(shí)候酪术,往往要通過(guò)讓其中一端使用weak來(lái)解決器瘪,比如: delegate代理屬性,通常就會(huì)聲明為weak绘雁。
自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒(méi)有必要再?gòu)?qiáng)引用一次時(shí)也會(huì)使用weak援所。比如:自定義 IBOutlet控件屬性一般也使用weak庐舟,當(dāng)然也可以使用strong。
2.strong 與copy的區(qū)別
strong 與copy都會(huì)使引用計(jì)數(shù)加1住拭,但strong是兩個(gè)指針指向同一個(gè)內(nèi)存地址挪略,copy會(huì)在內(nèi)存里拷貝一份對(duì)象,兩個(gè)指針指向不同的內(nèi)存地址
3.__block與__weak的區(qū)別
__block是用來(lái)修飾一個(gè)變量滔岳,這個(gè)變量就可以在block中被修改
__block:使用 __block修飾的變量在block代碼塊中會(huì)被retain(ARC下會(huì)retain杠娱,MRC下不會(huì)retain)
__weak:使用__weak修飾的變量不會(huì)在block代碼塊中被retain
同時(shí),在ARC下谱煤,要避免block出現(xiàn)循環(huán)引用 __weak typedof(self)weakSelf = self;
4.1 block變量定義時(shí)為什么用copy摊求?block是放在哪里的?
block本身是像對(duì)象一樣可以retain刘离,和release室叉。但是睹栖,block在創(chuàng)建的時(shí)候,它的內(nèi)存是分配在棧(stack)上茧痕,可能被隨時(shí)回收野来,而不是在堆(heap)上。他本身的作于域是屬于創(chuàng)建時(shí)候的作用域踪旷,一旦在創(chuàng)建時(shí)候的作用域外面調(diào)用block將導(dǎo)致程序崩潰曼氛。通過(guò)copy可以把block拷貝(copy)到堆,保證block的聲明域外使用令野。
特別需要注意的地方就是在把block放到集合類(lèi)當(dāng)中去的時(shí)候搪锣,如果直接把生成的block放入到集合類(lèi)中,是無(wú)法在其他地方使用block彩掐,必須要對(duì)block進(jìn)行copy构舟。
[array addObject:[[^{
NSLog(@"hello!");
} copy] autorelease]];
4.2 block 為什么不用strong?
block如果用到了self堵幽,就會(huì)retain self狗超,如果是strong的話,就造成了循環(huán)引用
官方文檔:You should specify copy as the property attribute, because a block needs to be copied to keep track of its captured state outside of the original scope. This isn’t something you need to worry about when using Automatic Reference Counting, as it will happen automatically, but it’s best practice for the property attribute to show the resultant behavior