block
??Block
:帶有自動(dòng)變量(局部變量)的匿名函數(shù)搀继,它是C
語言的擴(kuò)充功能泳炉。之所以是拓展估脆,是因?yàn)?code>C語言不允許存在這樣匿名函數(shù)。在Block
中訪問一個(gè)外部的局部變量衰倦,Block
會(huì)持用它的臨時(shí)狀態(tài)袒炉,自動(dòng)捕獲變量值,外部局部變量的變化不會(huì)影響它的的狀態(tài)樊零,下面是個(gè)小例子我磁。
int a = 10;
void (^block)(void) = ^{
NSLog(@"block = %d",a);
};
a = 5;
block();//結(jié)果為10
是否會(huì)對變量捕獲遵循以下原則
block的本質(zhì)
block
本質(zhì)上是一個(gè)OC
對象,它內(nèi)部也有個(gè)isa
指針block
是封裝了函數(shù)調(diào)用以及函數(shù)調(diào)用環(huán)境的OC
對象
block的類型
block類型的判斷標(biāo)準(zhǔn)
block的copy
在ARC環(huán)境下淹接,編譯器會(huì)根據(jù)情況自動(dòng)將棧上的
block
拷貝到堆上十性,比如
1、block
作為函數(shù)返回值時(shí)
2塑悼、將block
賦值給__strong
指針時(shí)
3劲适、block
作為cocoa API
中方法名含有usingBlock
的方法參數(shù)時(shí)
4、block
作為GCD API
的方法參數(shù)時(shí)
對象類型的auto變量
1厢蒜、當(dāng)
block
內(nèi)部訪問了對象類型的auto變量時(shí)霞势,如果block
是在棧上,將不會(huì)對auto
變量產(chǎn)生強(qiáng)引用
2斑鸦、如果block
被拷貝到堆上愕贡,會(huì)調(diào)用block
內(nèi)部的copy
函數(shù),copy
函數(shù)內(nèi)部會(huì)調(diào)用_Block_object_assign
函數(shù)巷屿,_Block_object_assign
會(huì)根據(jù)auto
變量的修飾符(__strong,__weak,__unsafe_unretained)
做出相應(yīng)的操作固以,類似于retain
(行程強(qiáng)應(yīng)用、弱引用)
3嘱巾、如果block
從對上移除憨琳,會(huì)調(diào)用block內(nèi)部的dispose
函數(shù),內(nèi)部會(huì)調(diào)用_Block_object_dispose
函數(shù)旬昭,這個(gè)函數(shù)會(huì)自動(dòng)釋放引用的auto
變量篙螟,類似于release
__block修飾符
__block
可以用于解決block內(nèi)部無法修改auto
變量值得問題
__block
不能修改全局變量、靜態(tài)變量(static
)
編譯器會(huì)將__block
變量包裝成一個(gè)對象
block產(chǎn)生的循環(huán)引用解決辦法
用
__weak
问拘、__unsafe_unretained
解決
用__block
解決
__unsafe_unretained id weakSelf = self;
self.block = ^{
};
__block id weakSelf = self;
self.block = ^{
};
??相信通過這片文章遍略,大家對block
有了一個(gè)全新的認(rèn)識(shí)惧所,希望有不足之處,大家可以指出绪杏,然后完善下愈。