原文:http://blog.csdn.net/zhangao0086/article/details/38273239

一般来说我们总会在设置Block之后,在合适的时间回调Block,而不希望回调Block的时候Block已经被释放了,所以我们需要对Block进行copy,copy到堆中,以便后用。

当一个Block被Copy的时候,如果你在Block里进行了一些调用,那么将会有一个强引用指向这些调用方法的调用者,有两个规则:

  • 如果你是通过引用来访问一个实例变量,那么将强引用至self
  • 如果你是通过值来访问一个实例变量,那么将直接强引用至这个“值”变量
苹果官方文档里有两个例子来说明这两种情况:
上面第一种情况相当于用self.xxx来访问实例变量,所以强引用指向了self;第二种情况把实例变量变成了本地临时变量,强引用将直接指向这个本地的临时变量。大多数情况下,我们只用处理第一种情况就行了,因为第二种情况虽然会造成循环引用,但是临时变量很快就被释放了,不会造成真正的循环引用。要避免强引用到self的话,用__weak把self重新引用一下就行了,像这样:
[objc] view plain copy
  1. __weak ViewController *weakSelf = self;

转载于:https://www.cnblogs.com/liuyingjie/p/5274490.html

如何避免在Block里用self造成循环引用相关推荐

  1. iOS开发笔记(二):block循环引用

    写这篇文章的缘由是第一次面试时被问到了block循环引用的问题,当时回答的不是很好,首先要明确的是,block是否用copy修饰决定不了循环引用的产生,在此再一次进行补强,有不对的地方还请多多指教. ...

  2. block(六)循环引用-b

    在ARC与非ARC环境下对block使用不当都会引起循环引用问题,一般表现为,某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身,简单说就是self.theBloc ...

  3. Block 的循环引用

    Block是在栈上生成的,所以一般使用copy方法把Block复制到堆上,避免Block被立刻释放. Block会对内部的变量形成强引用,而如果同时该变量又持有这个Block,就会导致循环引用而无法释 ...

  4. 快速定位Product assignment block里对应的修改逻辑使用的function module

    Created by Jerry Wang, last modified on May 16, 2014 假设需要debug Product overview page里当修改Notes assign ...

  5. block里的self、weakSelf、strongSelf

    转自  http://www.cnblogs.com/zhang-chi/p/5532272.html ARC下,关于block里面使用self.weakSelf.strongSelf,理解一直没有特 ...

  6. Block的循环引用

    2019独角兽企业重金招聘Python工程师标准>>> 在ios常见的循环引用中曾经提到过block: 看看上面最基本的block循环应用,self包含block,block包含了s ...

  7. Block 本质、实现原理、内存管理、循环引用、__block等

    一.Block介绍 1.1概念: 将函数及其执行上下文封装起来的对象 底层用struct实现 1.2block实现原理: a .新建项目 代码放入file.m中 b.打开终端cd到项目目录下 c.敲c ...

  8. iOS block循环引用问题深究

    对象A持有对象B,调用B的block参数方法,在里面使用了self.在使用block我们都会默认在里面使用weakself,网上搜了很多解释都是为了防止循环引用,以防self被持有导致内存泄露. 那么 ...

  9. ios Block底层详解、框架结构:捕获、对象类型、__block、__forwarding、循环引用

    1:捕获 2:block类型 2.1:问题 :mrc环境下  下面讲的都是mrc环境下,会真实很多 2.2:在arc下,block 自动加上copy的情况---:返回block. 2.3:在arc下, ...

最新文章

  1. 问题总结两天来两场实习面试(中科创达、华为)
  2. 近期活动盘点:第一届“数据故事计划”、 第三届搜狐校园算法大赛
  3. python教程实例-python教程实例
  4. QT4到QT5的变化!
  5. 002 PECompact 1.84
  6. ngrok布置外网访问环境
  7. 九度OJ #1437 To Fill or Not to Fil
  8. 一种简易的聊天泡泡设置颜色以及添加描边的方式
  9. java信号量源代码_Java信号量Semaphore原理及代码实例
  10. centos 6.5环境利用iscsi搭建SAN网络存储服务及服务端target和客户端initiator配置详解...
  11. 关于ele框架样式修改
  12. Packet Tracer 和 Wirshark 抓取数据包
  13. Vue中使用 Aplayer 和 Metingjs 添加音乐插件
  14. let , const , var , 的区别
  15. MapReduce 的基本原理
  16. HDU - 1495 非常可乐
  17. 中国(杭州)跨境电子商务综合试验区的实践和探索
  18. share 分享到其他平台 代码
  19. Cassandra笔记
  20. 「国内招聘」软件工程师

热门文章

  1. Chrome三天内的第二枚0Day
  2. ctfshow-WEB-web1签到题
  3. [SQL Server 2014] SQL Server 2014新特性探秘
  4. 关于ConcurrentDictionary的线程安全
  5. 快速上手Expression Tree(一):做一做装配脑袋的Expression Tree 习题
  6. EVENT:10218 dump uba of applied undo
  7. 精通语言不等于是一个好的软件开发人员
  8. HOW TO: Troubleshoot development errors in MOSS 2007
  9. prim算法 最小生成树
  10. 怎样把gis锯齿边_ArcGIS地图锯齿处理的方法