1.參考文章http://www.itdecent.cn/p/bc794fa07167
常規(guī)寫法:
__weak typeof(self)weakSelf = self;
block = ^(){
__strong typeof(weakSelf)strongSelf = weakSelf;
};
類似高級(jí)寫法
@weakify 將當(dāng)前對(duì)象聲明為weak..
這樣block內(nèi)部引用當(dāng)前對(duì)象,就不會(huì)造成引用計(jì)數(shù)+1可以破解循環(huán)引用
@strongify 相當(dāng)于聲明一個(gè)局部的strong對(duì)象,等于當(dāng)前對(duì)象.
可以保證block調(diào)用的時(shí)候,內(nèi)部的對(duì)象不會(huì)釋放
@weakify(self);
self.blk = ^{
@strongify(self);
NSLog(@"In Block : %@",self);
};
疑問一:
為什么block里面使用強(qiáng)引用?
答:你有沒有遇到過耗時(shí)block,你有沒有寫過block里面的一大堆代碼呢?
如果這一大堆代碼里多處地方使用了weaskself呢?
如果這一大堆代碼里有對(duì)weaskself.array進(jìn)行了遍歷了呢?
那么block在使用weakself的時(shí)候,weakself指向的對(duì)象會(huì)不會(huì)被釋放呢?
它是可能被釋放的,那么就會(huì)出現(xiàn)崩潰了。
block里面是{}括起來的,里面的strong引用是創(chuàng)建一個(gè)強(qiáng)引用的對(duì)象指針,被引用對(duì)象的引用計(jì)數(shù)加一,但是這個(gè)對(duì)象指針是個(gè)局部對(duì)象,他的生命周期只在這個(gè){}里面。在到達(dá)}時(shí),局部對(duì)象指針就被釋放了。所以,它保證block執(zhí)行期間,弱引用對(duì)象不會(huì)被釋放。
疑問二:
里面使用強(qiáng)引用,為什么不會(huì)循環(huán)引用?
答:不會(huì),block里面那個(gè)強(qiáng)引用只是 局部變量,它是屬于{}的,屬于當(dāng)時(shí)執(zhí)行代碼的上下文環(huán)境中的,它保存在棧上的。所以它不被block復(fù)制到堆上,或者形成強(qiáng)引用。
block擁有的還是哪個(gè)弱引用。