在基本的开发中遇到 需要弱引用时候 我一般 用 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 = ;
}
}

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

iOS __weak 和 __block 的使用探讨的更多相关文章

  1. What the difference between __weak and __block reference?

    近日遇到一个非常细的知识点,关于block的循环引用问题.相比非常多人都遇到了.也能顺利攻克了,至于block方面的技术文章.那就很多其它了.这里不再赘述,可是有这样一个问题: What the di ...

  2. __weak 和 __block 区别

    Blocks理解: Blocks可以访问局部变量,但是不能修改 如果修改局部变量,需要加__block __block int multiplier = 7; int (^myBlock)(int) ...

  3. IOS开发 __weak与__block修饰符到底有什么区别

    API Reference对__block变量修饰符有如下几处解释: //A powerful feature of blocks is that they can modify variables ...

  4. __weak与__block修饰符区别

    API Reference对__block变量修饰符的解释,大概意思: 1.__block对象在block中是可以被修改.重新赋值的. 2.__block对象在block中不会被block强引用一次, ...

  5. __weak与__block区别分析

    API Reference对__block变量修饰符有如下几处解释: //A powerful feature of blocks is that they can modify variables ...

  6. __weak与__block区别,深层理解两者区别

    准备工作 首先我定义了一个类 MyObject 继承 NSObject,并添加了一个属性 text,重写了description方法,返回 text 的值.这个主要是因为编译器本身对 NSString ...

  7. iOS __weak __strong WeakSelf StrongSelf

    在block中常常会用到self,可是会造成循环引用.这时候就需要这样来解决这个问题: #define WeakSelf __weak typeof(self) weakSelf = self #de ...

  8. iOS __weak学习碰到的疑问

      __weak弱引用并不持有对象,所以赋值给__weak修饰符的变量也不会改变计数器的值.    main.m id __strong obj3 = nil;     id __weak obj1= ...

  9. iOS 关于本地持久化存储的探讨

    目前,用以本地化存储的方式有很多,常用的有以下: 1.临时缓存 先说说临时缓存,临时缓存一般相当于用来管理应用程序中全局需要常用的一些内容.比如当前用户的ID或者当前的定位信息等. 常用的方式就是写一 ...

随机推荐

  1. OpenGL三角形的双面不同颜色的绘制

    对于一个三角形,我要给它正反面不同的颜色.然后通过旋转,看出它的效果. 我只想到了2种方法,下面我来写一下这两种方法. 第一种方法,通过角度的判断重设glColor3f的参数(这种方法局限性很大,不推 ...

  2. github上比較好的开源项目(持续更新)

    1:https://github.com/Skykai521/StickerCamera 实现相机功能 实现对图片进行裁剪的功能 图片的滤镜功能 能为图片加入贴纸(贴纸可移动,放大,旋转) 能为图片加 ...

  3. 卸载Linux自带openjdk

    1.查看自带jdk版本   java -version 2.查看   rpm  -qa | grep java 显示如下信息: java-1.4.2-gcj-compat-1.4.2.0-40jpp. ...

  4. jquery将form表单序列化常json

    var formData = {};$.each(form.serializeArray(),function(i, item){ formData[item.name] = item.value;} ...

  5. sublime使用技巧(4)-- 其他技巧【持续更新】

    命令模式 1.切换语言格式,ctrl + shirt + p 2.简化操作 ctrl + shirt + p 输入 snippet:function 自动生成function的基本结构!tab键 移动 ...

  6. ubuntu 16.04查询文件安装目录

    dpkg -L filename dpkg -l | grep filename whereis filename find / -name filename

  7. shiro自定义logout filter

    虽然shiro有自己默认的logout过滤器,但是,有些时候,我们需要自己定义一下操作,比如说loutgout后,进入指定页面,或者logout后写入日志操作,这个时候,我们可以通过自定义logout ...

  8. Ubuntu 16.04 关闭/打开笔记本触摸板

    由于笔记本触摸板太多灵敏,影响使用,所以禁用掉触摸板. 禁用触摸板命令: sudo rmmod psmouse 启用触摸板命令 sudo modprobe psmouse 注意:启用之后可能会有几秒钟 ...

  9. HDU 3397 Sequence operation(区间合并 + 区间更新)

    题目链接:pid=3397">http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:给定n个数,由0,1构成.共同拥有5种操作. 每一个操 ...

  10. web安全之SQL注入---第四章 如何进行SQL注入攻击

    第四章 如何进行SQL注入攻击1.数字注入2.字符串注入    '#    '--