先介绍一下Block声明:大概是来自己国外的某位牛人写的吧Block声明
Block循环引用:
Block的循环引用是说self持有block,而同时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
所以陷入循环引用,demo无法从内存中消失,内存循环。(block持有self导致retain计数+1)
解决方法:
__weak typeof(ViewController) *weakDemo = demo;
block里面的self一律用weakSelf代替
一般的局部block大胆使用self!
另外还有Block访问局部变量的问题:
Block可以访问局部变量Index,回调的时候不用回调当前的cell的indexPath,直接使用局部变量index即可,但是如果想要修改局部变量,需要把变量设置成__block。
注:以上代码来源于某位网友,如侵删。
网友评论