Block你知道几种?Block的循环引用你有几种解决办法呢?

iOS底层探索之Block(一)——初识Block(你知道几种Block呢?)

在上一篇博客已经介绍了block的类型,那么本篇博客废话不多说直接进入主题,手把手带你如何解决Block循环引用的问题!

1. 为什么会出现循环引用分析

1.1 正常情况

在正常情况下,A持有了BB引用计数+1,当 A释放的时候给 B发送信号,B 接受到 release信号后,引用计数-1

正常使用,正常释放是不会出现循环引用问题的,但是如果出现你中有我,我中有你的情况,就会出现循环引用问题了。更形象的比喻,就是鹤蚌相争故事了。

1.2 循环引用原因

互相持有都释放不了,如下图所示:


这里出现循环引用问题是,AB互相持有了,两方都释放不了,A无法调用 dealloc就给 B发送不了 release消息,B 收不到 release消息引用计数不会减少,也就不能调用 dealloc方法进行释放。

那么出现循环引用该如何解决呢?

1.3 循环引用解决思路

出现循环引用的解决办法就是,打破互相持有的局面,打破任意一方的持有都可以。

2. 解决方案

先来看看一个循环引用的例子,如下:

这里出现循环引用的原因是:

self持有了 blockblock 里面又持有了 self,形成了一个闭环,互相持有,无法释放。

那么再来看看,下面

iOS底层探索之Block(二)——如何解决Block循环引用问题?相关推荐

  1. iOS底层探索(二) - 写给小白看的Clang编译过程原理

    iOS底层探索(一) - 从零开始认识Clang与LLVM 写在前面 编译器是属于底层知识,在日常开发中少有涉及,但在我的印象中,越接近底层是越需要编程基本功,也是越复杂的.但要想提升技术却始终绕不开 ...

  2. iOS底层探索二(OC 中 alloc 方法 初探)

    前言 相关文章: iOS底层探索一(底层探索方法) iOS底层探索三(内存对齐与calloc分析) iOS底层探索四(isa初探-联合体,位域,内存优化) iOS底层探索五(isa与类的关系) iOS ...

  3. iOS 底层探索篇 —— KVC 底层原理

    iOS 底层探索篇 -- KVC 底层原理 1. Method Swizzling的坑与应用 1.1 method-swizzling 是什么? 1.2 坑点 坑点1:method-swizzling ...

  4. iOS 底层探索 - 消息转发

    一.动态方法解析流程分析 我们在上一章<消息查找>分析到了动态方法解析,为了更好的掌握具体的流程,我们接下来直接进行源码追踪. 我们先来到 _class_resolveMethod 方法, ...

  5. 相亲app开发,解决内存循环引用的问题

    循环引用是什么 ARC已经出来很久了,自动释放内存的确很方便,但是在相亲app开发应用中,并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按预期释放的一个无形杀手是--循环引用.循环引用可以简单理 ...

  6. nstimer循环引用_解决NSTimer循环引用导致内存泄漏的六种方法

    demo放在了GitHub 内存泄漏的原因: self强引用timer.timer添加在runloop上,只要timer不销毁self就销毁不了.当然了你可以选择在viewWillDisappear中 ...

  7. nstimer循环引用_iOS中解决NSTimer循环引用问题

    NSTimer使用不当就会造成内存泄漏,比如常见的使用方法: //定义 @property (nonatomic, strong) NSTimer *timer; //实现 self.timer = ...

  8. 如何避免在Block里用self造成循环引用

    原文:http://blog.csdn.net/zhangao0086/article/details/38273239 一般来说我们总会在设置Block之后,在合适的时间回调Block,而不希望回调 ...

  9. 解决flask循环引用的问题

    刚开始结构是这样的 app - init.py - models.py init.py是这样的 ` from flask import Flask from flask-sqlalchemy impo ...

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

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

最新文章

  1. python二叉搜索树建立_700. 二叉搜索树的搜索(Python)
  2. java实现redis缓存_java实现redis缓存功能
  3. swift_038(Swift之guard关键字(守护))
  4. SESSION 页面刷新 失效
  5. CRMEB删除公众号首页logo动画
  6. excel表格怎么调整行高和列宽_8个实用Excel小技巧,谁用谁说好
  7. 面试中对hashMap的再次理解,负载因子为什么为0.75
  8. Redhat as 4 中创建 LVM 逻辑卷
  9. jprofiler_监控远程linux服务器的JVM进程(转 非常棒)
  10. 微信浏览器ISO系统底部导航栏
  11. 上课学计算机的周记,计算机实习周记20篇
  12. 通用商城系统V5.0
  13. SpringCloud整合Feign和Nacos报错:No Feign Client for loadBalancing defined. Did you forget to include?
  14. 大学生软件设计大赛文档要求
  15. 乌镇现场 | 倪光南:人工智能应该更好的为人类的服务
  16. Codeforces Round #815 (Div. 2) A-D2
  17. 一年读完100本书(1/100)《微习惯》2021-01-18
  18. SD从零开始10 框架协议(Outline Agreement)—合同/计划协议
  19. 网络课笔记整理——物理层
  20. Armijo-Goldstein法则和Wolfe-power法则图解

热门文章

  1. 编程时遇到问题的解决方向
  2. [core java学习笔记][第十一章异常断言日志调试]
  3. 我的ES6学习之路(一)
  4. Ajxa验证用户和二级联动的实例(五)
  5. gdb对应vc调试命令
  6. 简单的实现HTTP密码验证登陆
  7. SQL语句Not IN优化方案
  8. [转载]使用Vitamio打造自己的Android万能播放器(2)—— 手势控制亮度、音量、缩放...
  9. 跑通LSD-SLAM
  10. 企业销售管理现状分析与解决思路(转)