• iOS __weak 和 __block 的使用探讨


    在基本的开发中遇到 需要弱引用时候 我一般 用 weak  预防 死锁的时候 我会用 block 

    的确没出过大错  但是这样处理 的确有点囫囵  现在我想好好理解一下这两个修饰符

    "block中用到的外部变量最好使用 __weak 修饰,避免内存泄露; block容易引起引用循环的根本原因是: 1,对于(block内部用到的)外部变量,对其执行retain 的时机 与该block的执行时机是不同步的,在block声明的时候就对外部变量进行了retain,而block何时执行甚至是否执行都是不可预测的; 2,block 一般是匿名的,而且copy赋值的,手动释放block对象比较困难"

    我理解的意思是 在使用闭包 时候建议 外部变量 使用 __weak 弱引用来修饰   有两个要点如下:

    1.若附有__weak 修饰符的变量所引用的对象被废弃,则将nil 赋值给该变量

    下边的代码就可以解释成 当 self.helperView 被废弃的时候 helperView 为nil

    self.helperView = [[LittleHelperView alloc]init];//__weak helperView所引用的对象 self.helperView
            __weak LittleHelperView *helperView = self.helperView;//__weak 修饰的变量 helperView
    
            helperView.tapBlock = ^(LittleHelperActionType actionType,__weak HelperListAction * _Nonnull  helperAction){
                [self golittleHelperViewAction:actionType andAction:helperAction];
            };

    2. 使用附有__weak 修饰符的变量,即是使用注册到autoreleasepool 中的对象

    我的理解就是 操作  __weak LittleHelperView *helperView  就是在操作  self.helperView 就是说 操作弱引用 就是间接操作弱引用对象 

    由于最开始生成并持有的对象为附有__strong修饰符变量self.helperView所持有的强引用,所以在该变量作用域结束之前都始终存在。因此如下所示,在变量作用域结束之前,可以持续使用附有__weak修饰符的变量helperView所引用的对象。

    其实这两条 大概表述的是 一个意思

    网上 一篇文章很受用  分享给大家 http://my.oschina.net/u/255456/blog/423991

    __block比使用__weak修饰符的好处是可以更改变量的值   __weak 只是引用 __block 可修改 引用对象的值  

    也就是说在Block使用中,Block内部能够读取外部局部变量的值。但需要改变这个变量的值时,我们需要给它附加上__block修饰符。

    __block另外一个比较多的使用场景是,为了避免某些情况下Block循环引用的问题,我们也可以给相应对象加上__block 修饰符

    所以 才说 上面橘色的那句

    参考 http://chun.tips/blog/2014/11/13/hei-mu-bei-hou-de-blockxiu-shi-fu/

    使用场景 模拟  __block避免循环引用 

    如果你引用的是一个实例变量,它会直接对self进行retain,这有时候有可能会产生一个引用环(两个或以上的对象之间直接或间接地互相引用)并导致内存泄露。解决的方法是:当需要在Block中访问实例变量的时候,创建一个指向self的指针,并对其使用__block修饰符,这样self不会被自动retain: 
    
    - (void)foo {
        __block id blockSelf = self;
        ^ {
            blockSelf->bar = 3;
        }
    }

     参考 http://m.blog.csdn.net/blog/shishuio/8468423

  • 相关阅读:
    asp.net 读取Excel文档
    ASP.NET实现IE下禁用浏览器后退按钮办法
    asp.net 追加文本(追加写入记事本)
    Sql Server中charindex、patindex的区别
    css3 简单动画
    ie6下兼容问题
    IE6下 input 背景图滚动问题及标签规范
    css2---必须学的经典---定位问题
    EF 用CallContext上下文管理
    EF查询分页
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/5027202.html
Copyright © 2020-2023  润新知