iOS block 闭包的学习 - Go语言中文社区

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
可以好好揣度一下  很受用

转载于:https://www.cnblogs.com/someonelikeyou/p/4867885.html

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_34100227/article/details/94538146
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 23:09:33
  • 阅读 ( 1079 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢