先介紹一下Block聲明:大概是來自己國外的某位牛人寫的吧Block聲明
Block循環(huán)引用:
Block的循環(huán)引用是說self持有block盟蚣,而同時(shí)Block持有self玷坠。
ViewController.h
typedef void (^executeFinishedBlock)(void);
typedef void (^executeFinishedBlockParam)(ViewController *demo);
@interface ViewController : UIViewController
{
executeFinishedBlock finishblock;
executeFinishedBlockParam finishblockparam;
}
ViewController.m
ViewController *demo = [[ViewController alloc] init];
[demo setFinishedBlock:^{
if (weakDemo.resultCode == 200) {
NSLog(@"call back ok.");
}
}];
在.h文件中奶卓,ViewController持有finishBlock,在.m文件中,finishBlock里面又持有self
所以陷入循環(huán)引用,demo無法從內(nèi)存中消失玻孟,內(nèi)存循環(huán)。(block持有self導(dǎo)致retain計(jì)數(shù)+1)
解決方法:
__weak typeof(ViewController) *weakDemo = demo;
block里面的self一律用weakSelf代替
一般的局部block大膽使用self鳍征!
另外還有Block訪問局部變量的問題:
Block可以訪問局部變量Index黍翎,回調(diào)的時(shí)候不用回調(diào)當(dāng)前的cell的indexPath,直接使用局部變量index即可蟆技,但是如果想要修改局部變量玩敏,需要把變量設(shè)置成__block。
注:以上代碼來源于某位網(wǎng)友质礼,如侵刪。