Objective-C——强引用、弱引用(Strong、Weak)

(转载)

编写Objective-C代码的很大一部分工作是管理可执行代码保持的对象引用,还有被引用对象保持的对另外一个对象的引用。在ARC出现之前,Objective-C在IOS中使用手动内存管理,在OS X中还可使用垃圾回收机制。这两个方法都有他们各自的优缺点。现在Objective-C使用ARC,其结合了这两种方法最好的一面。

ARC,中文简称自动引用计数,是一种编译器机制,在编译期间编译器将手动内存管理的调用插入到代码中。这段内存管理代码通过判断一旦对象没有任何进来的强引用,它将被释放,如果它是最后一个持有另一些对象强引用的对象,则这些对象也会被释放,对它们的其他对象的处理以此类推,编译器非常智能,ARC代码被优化的很好。尽管ARC将开发者从编写手动内存管理代码的工作中解放出来,但如同使用垃圾回收的平台,它仍然不能打破引用循环。因为这个原因,开发者需要给编译器某些指导以避免引用循环。下图展示了一个引用循环:

只有对象C释放了对象A后其才能被释放,而只要对象B有一个对它的强引用那么对象C就永远不会被释放。最后,除非对象A被释放否则对象B永远不会被释放。这就是一个引用循环,将导致引用程序发生内存泄漏。

但是,如果我们在上图中将对象C持有的对象A的引用(在途中用实线表示)被替换成一个弱引用(用虚线表示),如下图。

弱引用不阻止对象被释放,所以对象A被释放,接着是对象B,最后是对象C。

如果熟悉C或C++,你可能会注意到一个使用弱引用的问题。如果对象可在任何时候被释放,并且你有一个该对象的弱引用,那么最终会得到一个悬空指针(这个指针的地址指向的地址仍然存在,但是对象已经被释放)。在ARC中,这个现象不会存在,一旦对象被释放则指向这些对象的弱引用将会变为nil。

Objective-C中,默认情况下,没有使用任何关键字的声明的实例变量和局部变量都是强引用,将变量声明为弱引用需使用weak关键字。

如何在写代码的时候判断变量是该用强引用还是弱引用?

一个常见的方法就是将强引用和弱引用分别想象为“拥有”和“被拥有”。如果一个对象完全属于包含它的对象,那么它使用强引用。如果一个对象被两个以上的对象所拥有,并不完全属于一个对象,则使用弱引用,尽管该方法不是对于所有引用逗适用,但它确实是一个记住Objective-C内存管理约定的好技巧。

时间: 2024-10-13 22:49:06

Objective-C——强引用、弱引用(Strong、Weak)的相关文章

Java -强引用&弱引用

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

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

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

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

强引用: 我们一般使用的就是强引用.垃圾回收器绝不会回收它. 当内存空间不足时Java虚拟机宁愿抛出OutOfMemoryError错误使程序异常终止,也不会回收具有强引用的对象来解决内存不足的问题 软引用: 如果一个对象具有软引用,那么当内存空间足够的时候GC就不会回收它,如果内存空间不足了,就会回收这些对象的内存空间. 弱引用: 如果一个对象具有弱引用,那么当GC线程扫描的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存. 但由于垃圾回收器是一个优先级很低的线

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

https://www.cnblogs.com/yw-ah/p/5830458.html Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.equels(new Object());而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉,这也是我们经常所用到的编码形式. 软引用: 非必须引用,内存溢

Java四种引用 强引用,软引用,弱引用,虚引用(转)

强引用 : 只要引用存在,垃圾回收器永远不会回收 Object obj= new Object(); Object 对象对后面 new Object的一个强引用, 只有当obj这个被释放之后,对象才会被释放掉, 这也是我们经常所用到的编码形式. 软引用: 非必须引用,内存溢出之前进行回收,可以通过以下代码实现 Object obj = new Object(); SoftReference<Object> sf = new SoftReference<Object>(obj);ob

软引用 弱引用 图片的加载与缓存

演示示例 public class MainActivity extends ListActivity {     private TextView tv_info;     private ImageView imageView;     public static final String BIG_IMAGE_PATH = Environment.getExternalStorageDirectory().getPath() + "/big.jpg";     public sta

面向对象编程思想以及强、弱引用总结

面向过程:使用步骤划分功能,然后用函数一步一步的调用. 面向对象:OOP (Object Oriented Programming) 使用功能来简化问题. 面向对象语言 : C++. Java. C#. 重点概念: 对象.类.封装.继承.多态等等. 面向对象3大特征:封装.继承.多态. 封装的思想:”麻烦自己,方便别人”. 两种编程思想:面向对象设计具有良好的可扩展性.可重用性. 类和对象类:具有相同特征和行为的事物的抽象. 对象:对象就是类的实例,类的具体表现.生活中的万物都是对象.类和对象是

弱符号与强符号,弱引用与强引用

1.弱符号与强符号 对C/C++而言,编译器默认函数和初始化了的全局变量为强符号.未初始化的全局变量为弱符号.此处弱符号与强符号均是针对定义来说的,不是针对符号的引用.也可以通过GCC的 "__attribute__((weak))"来定义任何一个强符号为弱符号. [cpp] view plain copy extern in ext; int weak; int strong = 1; __attribute__((weak)) int weak2 = 1; int main() {

[转]Java 的强引用、弱引用、软引用、虚引用

1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题.如果不使用时,要通过如下方式来弱化引用,如下: o=null; // 帮助垃圾收集器回收此对象 显式地设置o为null,或超出对象的生命周期范围,则gc认为该对象不

【转】JAVA四种引用(强引用,弱引用,软引用,虚引用)

转自:http://www.cnblogs.com/gudi/p/6403953.html 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题.如果不使用时,要通过如下方式来弱化引用,如下: o=null; // 帮