美文网首页
Block循环引用问题

Block循环引用问题

作者: 月咏蝴蝶 | 来源:发表于2015-12-11 16:46 被阅读282次

    先介绍一下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循环引用问题

          本文链接:https://www.haomeiwen.com/subject/lfmyhttx.html