zoukankan      html  css  js  c++  java
  • ARC下block循环引用的解决方式

    在MRC情况下对block外的对象加上__block有两个作用:

    • 说明变量可修改
    • 说明指针指向的对象不做隐式的retain操作
      在ARC情况下即便对对象加上了__block,因为__block只声明该对象可以修改,一个对block捕获的也是对象也是一个强引用,所以这时就要对对象手动释放,否则依旧会造成循环引用:
        SeondViewController *__block ctl = [[SeondViewController alloc] init];
        ctl.testBlock = ^{
            [ctl sayHai];
            ctl = nil;
        };    
        [self.navigationController pushViewController:ctl animated:YES];
    

    该方式的弊端是如果该block不调用,则依旧不会解除循环引用,这时__weak是个更优的选择:

        SeondViewController * ctl = [[SeondViewController alloc] init];
        SeondViewController * __weak weakCtl = ctl;
        ctl.testBlock = ^{
            [weakCtl sayHai];
        };
        [self.navigationController pushViewController:ctl animated:YES];
    
  • 相关阅读:
    Python shutil模块
    Flask 上传文件
    Flask DBUtils
    flash-session
    Flash 上下文管理
    python 栈
    python 偏函数
    threding.local
    next() 与 nextLine() 区别
    Thread.sleep(1000*3); // 休眠3秒
  • 原文地址:https://www.cnblogs.com/GoodmorningMr/p/11775531.html
Copyright © 2011-2022 走看看