• iOS block 闭包的学习


    iOS  闭包 学习

    理解:
    1 .   闭包外界无法访问内部变量 ,它是一个独立的代码块.
    2 .   闭包可以作为 一个方法 ,甚至局部变量  全局 变量
    3 .   闭包 是一种引用类型
     
    注意要点:
     
    1  . 滥用闭包会有很大的问题,最严重的就是会产生循环引用(死锁). 举例子
    NSString* s =@"123";
        void (^block)() = ^() {
    
            NSLog(@"%@",s);
        };
        block();// 1
        s =@"abc”;
        block();// 2
    打印结果是  123
    
        123

    理解起来很简单,根据闭包特性,闭包外界无法访问内部变量, //1 处 内部变量 s 是 123  在外边又重新赋值 abc  //2 处打印 闭包里面的s 就不会在随闭包外界改变.

    那么在实际应用 过程中,一个代码块反复被调用的话,并且像上述方法一样使用,反复调用一个变量,那么就会出现循环引用的问题.

    解决方案:扩大局部变量的作用域 .举例子

    __block NSString* s = @"123";
    
       void (^block)() = ^() {
    
           NSLog(@"%@",s);
        };
        block();//3
    
        s =@"abc”;
    
        block();//4
    
    打印结果是  123
    
              abc
     
    __block标示的变量,会将变量的作用域变大.s相当于变成全局的作用域.
    所以 结果 是 123  然后是 abc 则不难理解.
     
    循环引用的问题 就是资源竞争 在ios 里面就是两个或两个以上强引用.
    所以  
    __weak NSString* s = @"123”;  也是满足需求
    通常我都这么干 (没报错 也不会有任何警告)
    __weak __block  NSString* s = @"123”;
     示例
    标记绿色 的方法实施后 警告都会消失
     
     
    常见用法
    我只是从实践的角度理解了一下闭包
     
    网上看到一个比较好的文章如下
    http://my.oschina.net/joanfen/blog/317644
    可以好好揣度一下  很受用
  • 相关阅读:
    毕业季 | 如何做出99分的答辩PPT
    git: error setting certificate verify locations解决办法
    获取表格里面的内容
    MD5加密算法
    mybatis多条件批量删除
    layer.confirm
    DevExpress控件的GridControl实现行多选
    sz与rz命令
    @TableField的使用
    C# WinForm 中Label自动换行 解决方法
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/4867885.html
Copyright © 2020-2023  润新知