API Reference對__block變量修飾符的解釋,大概意思:
1.__block對象在block中是可以被修改剃根、重新賦值的哩盲。
2.__block對象在block中不會被block強引用一次前方,從而不會出現(xiàn)循環(huán)引用問題狈醉。
API Reference對__weak變量修飾符的解釋,大概意思:
使用了__weak修飾符的對象惠险,作用等同于定義為weak的property苗傅。自然不會導(dǎo)致循環(huán)引用問題,因為蘋果文檔已經(jīng)說的很清楚班巩,當(dāng)原對象沒有任何強引用的時候渣慕,弱引用指針也會被設(shè)置為nil。
因此抱慌,__block和__weak修飾符的區(qū)別其實是挺明顯的:
1.__block不管是ARC還是MRC模式下都可以使用逊桦,可以修飾對象,還可以修飾基本數(shù)據(jù)類型抑进。
2.__weak只能在ARC模式下使用强经,也只能修飾對象(NSString),不能修飾基本數(shù)據(jù)類型(int)寺渗。
3.__block對象可以在block中被重新賦值匿情,__weak不可以。
PS:__unsafe_unretained修飾符可以被視為iOS SDK 4.3以前版本的__weak的替代品信殊,不過不會被自動置空為nil炬称。所以盡可能不要使用這個修飾符。
Block的生命周期管理非常的微妙涡拘,與ARC混在一起后玲躯,更加復(fù)雜。
當(dāng)Block延stack向上(up)傳遞的時候鳄乏,直接返回府蔗,編譯器會添加[[ copy] autorelease]代碼。
當(dāng)Block延stack向下傳遞給需要retain的容器的時候汞窗,需要顯式的調(diào)用[^{} copy]方法姓赤。
在ARC下,__block修改的NSObject指針依然會被retain仲吏。
在ARC下不铆,一個block內(nèi)引用一個對象的實例變量后,self會被retain裹唆,所以極易造成strong reference cycle誓斥,可以通過__weak指針來避免這種情形,因為ARC不會為__weak指針retain许帐。