文档章节

内存的循环引用

吾名蔚
 吾名蔚
发布于 2017/02/12 21:59
字数 751
阅读 32
收藏 1
点赞 0
评论 0

内存的循环引用

在 ARC,开发者将会定义一个变量为“strong”或“weak”。一个 weak 弱引用无法 retain 对象,而 strong 引用会 retain 这个对象,并将其引用计数加一。

循环引用就是指两个对象互相retain对方,通过OBJC的release是无法销毁这两个对象的

更严重的是,如果几个对象间接相互引用,比如a<-b b<-c  c<-a 那么a、b、c都无法通过release释放

循环引用的场景

一、定时器NSTimer

二、block的使用

三、代理delegate

四、父子对象关系(swift)

定时器:

我们在使用NSTimer时经常会作为一个类的属性使用

而NSTimer在初始化的时候回指定self为target.这就造成了self—>NSTimer-->self的循环引用的情况。另外在NSTimer一致处于validata状态时其引用计数器一直是大于0的

解决办法:在不使用定时器以后要调用invalidata移除定时器。

block的使用

block在引用外部的变量是,会对外部变量进行copy操作。在(ARC)模式下会对变量进行强引用,(MRC)模式下变量retainCount加1。当一个类把block作为成员变量时,在block内部使用了这个类本身。造成self—>block-->self或者self-->block-->类的成员变量循环引用的情况。

解决办法:在MRC模式下,在给block赋值时在外部用__blockmySelf = self;用__block修饰使用到的类。

在ARC模式下,用__weak修饰 

代理:

代理协议也是一个典型的场景,需要你使用弱引用来避免循环引用。将代理声明为 weak 是一个即好又安全的做法

父子对象关系

父子对象关系是一个循环引用的典型案例,不幸的是,它也是唯一一个存在于苹果文档中的案例。典型的解决方法就是,在子类定义一个指向父类的变量,声明为 weak 弱引用,从而避免循环引用。

在 swift 中子类指向父对象的变量是一个弱引用,这就迫使我们将该弱引用定义为 optional 类型。如果不使用 optional 可以有另一种做法,将指向父对象的变量声明为“无主引用(unowned)”(表明我们不持有该对象,也不对其进行内存管理)。然而在这种情况下,我们必须非常小心,确保只要还有子对象指向它,父对象不变成 nil,否则会直接闪退。

调试:

使用 Instruments 调试循环引用

XCode 自带了一个很强大的工具 Instruments,用于检测和定位循环引用。一旦你的 app 开发结束,即将提交到 Apple Store,先分析你的 app 是一个好的习惯。Instruments 有很多组件,可以用来分析 app 的不同方面,但是我们现在关心的是 Leak 选项。

© 著作权归作者所有

共有 人打赏支持
吾名蔚
粉丝 1
博文 7
码字总数 3455
作品 0
浦东
程序员
关于浏览器的内存泄露

什么是内存泄露 内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。在C++中,因为是手动管理内存,内存泄露是经常出现的事情。而现在流行的C#和Java等语言采用了自动...

bosscheng ⋅ 2015/08/25 ⋅ 0

js内存泄露问题

JavaScript 是一种垃圾收集式语言,这就是说,内存是根据对象的创建分配给该对象的,并会在没有对该对象的引用时由浏览器收回。JavaScript 的垃圾收集机制本身并没有问题,但浏览器在为 DOM ...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

iOS中Block循环引用刨根问底

序言 Blocks是苹果出的轻量型回调方式,使用起来既简洁,又方便。不过就是会产生一个问题:循环引用。进而会导致内存释放不了,造成内存泄漏。那到底怎么样才会产生循环引用呢?如何解决呢? ...

FlyOceanFish ⋅ 05/07 ⋅ 0

JavaScript 的垃圾回收与内存泄露

JavaScript采用垃圾自动回收机制,运行时环境会自动清理不再使用的内存,因此javascript无需像C++等语言一样手动释放无用内存。 在这之前先说一下垃圾回收的两种方式:引用计数与标记清除。 ...

smalldragonluo ⋅ 2014/06/16 ⋅ 0

iOS 面试题~避免循环引用~解决方法

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、概念: 循环引用:指的是多个对象相互引用时,使得引用形成一个环形,导致外部无法真正是否掉这块环形内存。其实有点类似死锁。 其实循环引用...

石虎132 ⋅ 2017/12/22 ⋅ 0

ios-常见的循环引用

介绍: 循环引用,指的是多个对象相互引用时,使得引用形成一个环形,导致外部无法真正是否掉这块环形内存。其实有点类似死锁。 举个例子:A->B->C->....->X->B ->表示强引用,这样的B的引用...

余成海 ⋅ 2016/04/12 ⋅ 0

c++ 智能指针及 循环引用问题

c++智能指针介绍 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不...

gfsfg8545 ⋅ 2014/04/07 ⋅ 0

iOS 面试全方位剖析 -- Block篇

block 介绍 截获变量 block修饰符 Block的内存管理 Block的循环引用 截获变量 先看一个问题 带着问题往下看,有这几种类型的变量 从这段代码来深入了解一下 使用 clang命令看一下编译后的源码...

PetitBread ⋅ 05/28 ⋅ 0

爱创课堂每日一题第五十三天- 哪些操作会造成内存泄漏?

内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。 垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该...

全栈web笔记 ⋅ 2017/11/14 ⋅ 0

【java基础】流程控制和数组

1、在处理if...else语句时候,总是考虑先处理包含范围更小的情况 2、if中条件执行体(代码块)有多行的时候,需加入大括号,当if下面只有一行的时候,可以不用加入大括号 3、break终止循环,...

zlt995768025 ⋅ 2017/12/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)

之前没接触过证书加密的话,对证书相关的这些概念真是感觉挺棘手的,因为一下子来了一大堆新名词,看起来像是另一个领域的东西,而不是我们所熟悉的编程领域的那些东西,起码我个人感觉如此,且很长...

颖辉小居 ⋅ 21分钟前 ⋅ 0

利用有限制通配符提升API灵活性(28)

1、参数化类型是不可变的 List<String> 不是List<Object>的子类,但是二者是有联系的 利用有限制的通配符类型处理类似情况 List<? extends Object>(生产者) Collection<? super E>(消费者......

职业搬砖20年 ⋅ 27分钟前 ⋅ 0

ssm框架 +bootstrap分页

这里有两种方式 方式一:自己写分页 方式二:使用插件PageHelper 1.自己写分页 1.1 效果 1.2 实现过程 1.2.1 创建分页公共类 //---------------------------1.属性-------------------------...

Lucky_Me ⋅ 34分钟前 ⋅ 0

Istio-快速安装

Istio是一个服务网格(Service Mesh)软件,可以在Kubernetes中快速安装: 1、创建配置文件 helm template install/kubernetes/helm/istio --name istio --namespace istio-system > $HOME/is......

openthings ⋅ 35分钟前 ⋅ 0

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 40分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 40分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 44分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 57分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 今天 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部