第33条:以弱引用避免保留环

  本条要点:(作者总结)

  对象图里经常会出现一种情况,就是几个对象都以某种方式互相引用,从而形成“环”(cycle)。由于 Objective-C 内存管理模型使用引用计数架构,所以这种情况通常会泄漏内存,因为最后没有别的东西会引用环中的对象。这样的话,环里的对象就无法为外界所访问了,但对象之间尚有引用,这些引用使得它们都能继续存活下去,而不会为系统所回收。

  最简单的保留环由两个对象构成,它们互相引用对方,图举例说明了这种情况。

              

  两个对象通过彼此之间的强

  这种保留环的产生原因不难理解,且很容易就能通过查看代码而侦测出来:

 1 #import <Foundation/Foundation.h>
 2
 3 @class EOCClassA;
 4
 5 @class EOCClassB;
 6
 7
 8
 9 @interface EOCClassA : NSObject
10
11 @property (nonatomic, strong) EOCClassB *other;
12
13 @end
14
15
16
17 @interface EOCClassB : NSObject
18
19 @property (nonatomic, Strong) EOCClassA  *other;
20
21 @end

  看代码很容易就能发现其中可能出现的保留环: 如果把 EOCClassA 实例的 other 属性设置成某个 EOCClassB 实例,而把这个 EOCClassB 实例的 other 属性又设置成这个 EOCClassA 实例,那么就会出现图中的保留环。

  

时间: 2024-12-09 22:52:11

第33条:以弱引用避免保留环的相关文章

第29条:理解引用计数

自动引用计数(Automatic Reference Counting, ARC) 垃圾收集器: 从Mac OS X 10.8开始,“垃圾收集器”(gargae collector)已经正式废弃了. 每个对象都有个计数器,用以表示当前有多少个事物想令此对象继续存活下去.叫做“保留计数”(retain count),也可以叫“引用计数”(reference count). 由三个方法操作计数器: reatain 递增 release 递减 autorelease 递减,自动释放池(autorele

Java 强引用、 软引用、 弱引用、虚引用

 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期.这4种级别由高到低依次为:强引用.软引用.弱引用和虚引用.下图为对象应用类层次. ⑴强引用(StrongReference)   强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内

Java -强引用&amp;弱引用

⑴强引用(StrongReference) 就是通过new得的对象引用 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题. 使用强引用的一个例子. 图像缓存问题,图像缓存应该阻止我们重新载入图像,所以图像缓存保存有内存中已有的所有图像的引用,如果使用通常的强引用,强引用本身会使得图像一直存留在内存中,这样就使得程序员像上面一样

Java基础 之软引用、弱引用、虚引用

1.概述 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及状态,程序才能使用它.这 就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走.一般说来,如果物品已经被扔到垃圾箱,想再 把它捡回来使用就不可能了.   但有时候情况并不这么简单,你可能会遇到类似鸡肋一样的物品,食之无味,弃之可惜.这种物品现在已经无用了,保留它会占空间,但是立刻扔掉它也不划算,因 为也许将来还会派用场.对于

Java 强引用,软引用,弱引用,虚引用

本文介绍对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.对象的强.软.弱和虚引用   在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期.这4种级别由高到低依次为:强引用.软引用.弱引用和虚引用.图1为对象应用类层次. 图1 ⑴强引用(StrongReference)    强引用

Java 强引用与软引用以及弱引用,虚引用

1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使 用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期.这4种级别由高到低依次为:强引用.软引用.弱引用和虚引用.图 1为对象应用类层次. 图1 ⑴强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内

java 强引用、软引用、弱引用、虚引用

1.对象的强.软.弱和虚引用    在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期.这4种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 图1为对象应用类层次1)强引用(StrongReference)    强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当

HashMap 之弱引用 - WeakHashMap

■ Java 引用的相关知识 1. 强引用 Object o = new Object(); 强引用是Java 默认实现 的引用,JVM会尽可能长时间的保留强引用的存在(直到内存溢出) 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题:只有当没有任何对象指向它时JVM将会回收 2. 软引用 public class SoftReference<T> extends Reference<T>

强引用,软引用,弱引用与虚引用

强引用:(StrongReference) 强引用指普通的对象引用 例如: StringBuffer str = new StringBuffer("hello world"); 局部变量str会被放到栈里,而StringBuffer实例对象会被放在堆内,局部变量str指向堆内的StringBuffer对象,通过str可以操作该对象,那么str就是StringBuffer的强引用 StringBuffer str1 = str; 当发生了这条语句,则 此时这两个引用都是强引用 强引用具