zoukankan      html  css  js  c++  java
  • block(七)__block和__weak的区别-b

    在MRC下,我们通常使用__block ,

    而在ARC下我们通常使用__weak , 或者__unsafe_unretaine __block(不安全,不建议使用) 来修饰对象防止循环引用而造成的内存泄露。

    一般只用__block和__weak,知道这两个的区别就行了!

    解释1:

    __weak不增加引用,__block增加引用

    举例,某对象self,self的strong成员变量有blockA,blockA内部引用了self,如果self不经过__weak处理,就会变成:

      self强引用blockA,blockA强引用self。就循环引用了.

    解释2:

    Blocks理解:

    Blocks可以访问局部变量,但是不能修改

    如果修改局部变量,需要加__block

     

     __block int multiplier = 7;
         int (^myBlock)(int) = ^(int num) {
             multiplier ++;//这样就可以了
             return num * multiplier;
         };


    __weak __typeof(&*self)weakSelf =self; 等同于

    __weak UIViewController *weakSelf =self;

    为什么不用__block 是因为通过引用来访问self的实例变量 ,self被retain,block也是一个强引用,引起循环引用,用__week是弱引用,当self释放时,weakSelf已经等于nil。

     

    扩展:NSTimer注意避免循环引用的地方,需要找个合适的时机和地方来 invalidate timer

     

    在引用计数的环境里面,默认情况下当你在block里面引用一个Objective-C对象的时候,该对象会被retain。当你简单的引用了一个对象的实例变量时,它同样被retain。但是被__block存储类型修饰符标记的对象变量不会被retain

    注意:在垃圾回收机制里面,如果你同时使用__weak和__block来标识一个变量,那么该block将不会保证它是一直是有效的。 

    这次给大家来个比较全面的总结,哈哈,共同进步

  • 相关阅读:
    [转]进程的用户栈和内核栈
    什么是URL,URL格式
    设计灵感
    Spring源码学习相关记录
    HTML图片标签路径解析
    一次Spring Bean初始化顺序问题排查记录
    是要面向对象,还是简单粗暴?
    2018/07/26学习节点记录
    数据结构-堆 Java实现
    2018 ICPC 徐州邀请赛 总结
  • 原文地址:https://www.cnblogs.com/isItOk/p/8108503.html
Copyright © 2011-2022 走看看