Block循环引用问题

先介绍一下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。

注:以上代码来源于某位网友,如侵删。

你可能感兴趣的:(Block循环引用问题)