zoukankan      html  css  js  c++  java
  • 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
    可以好好揣度一下  很受用
  • 相关阅读:
    小程序开发学习记录(一)
    解决移动端touch事件与click冲突的问题
    解决node.js使用fs读取文件出错
    防抖和节流
    promise
    ES6新的特性有哪些?
    css盒模型
    CSS3有哪些新特性?
    ES6新增的数据类型Map和Set。
    js求两个数组的交集|并集|差集|去重
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/4867885.html
Copyright © 2011-2022 走看看