一. API Reference對(duì)__block變量修飾符有如下幾處解釋:
//A powerful feature of blocks is that they can modify
variables in the same lexical scope. You signal that a block
can modify a variable using the __block storage type
modifier.
//At function level are __block variables. These are mutable
within the block (and the enclosing scope) and are preserved
if any referencing block is copied to the heap.
大概意思?xì)w結(jié)出來(lái)就是:
__block對(duì)象在block中是可以被修改博肋、重新賦值的敌呈。
二. API Reference對(duì)__weak變量修飾符有如下幾處解釋:
__weak specifies a reference that does not keep the
referenced object alive. A weak reference is set to nil when
there are no strong references to the object.
使用了__weak修飾符的對(duì)象刺洒,作用等同于定義為weak的property捍岳。自然不會(huì)導(dǎo)致循環(huán)引用問(wèn)題怠噪,因?yàn)樘O(píng)果文檔已經(jīng)說(shuō)的很清楚置侍,當(dāng)原對(duì)象沒(méi)有任何強(qiáng)引用的時(shí)候冲簿,弱引用指針也會(huì)被設(shè)置為nil晤柄。
因此瞧剖,__block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:
1.__block不管是ARC還是MRC模式下都可以使用,可以修飾對(duì)象可免,還可以修飾基本數(shù)據(jù)類(lèi)型抓于。
2.__weak只能在ARC模式下使用,也只能修飾對(duì)象(NSString)浇借,不能修飾基本數(shù)據(jù)類(lèi)型(int)捉撮。
3.__block對(duì)象可以在block中被重新賦值,__weak不可以妇垢。
4.__block對(duì)象在ARC下可能會(huì)導(dǎo)致循環(huán)引用巾遭,非ARC下會(huì)避免循環(huán)引用肉康,__weak只在ARC下使用,可以避免循環(huán)引用灼舍。
更多關(guān)于__block變量的詳細(xì)解釋吼和,參見(jiàn)我的另一篇文章,詳細(xì)探討了__block的實(shí)現(xiàn)原理
PS:__unsafe_unretained修飾符可以被視為iOS SDK 4.3以前版本的__weak的替代品骑素,不過(guò)不會(huì)被自動(dòng)置空為nil炫乓。所以盡可能不要使用這個(gè)修飾符。