美文网首页
iOS -- 弱引用(20)

iOS -- 弱引用(20)

作者: dingzhijie | 来源:发表于2017-10-10 11:27 被阅读0次

以 弱引用 避免保留环 (死循环)

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

最简单的保留环 由两个对象构成,他们互相引用对方, 这种保留环产生的原因不难理解, 而且很容易就能通过代码侦察出来.

避免保留环的最佳方式 就是弱引用, 这种引用经常用表示 '非拥有关系',将属性声明为 unsafe_unretained 即可,属性特质 unsafe_unretained 一词表明,属性值可能不安全,而且不归此实例所拥有,如果系统已经把属性所指的那个对象回收了, 那么在其上调用方法可能会导致应用程序崩溃. 由于本对象并不保留属性对象, 因此其有可能为系统所回收.

用 unsafe_unretained 修饰的属性特质,其语义同 assign 特质等价, 然而,assign 通常只用于 '整体类型' (int,float,结构体等), unsafe_unretained 则多用于对象类型, 这个词本身就表示其所修饰的属性可能是无法安全使用的.

OC 还有一项与 ARC 相伴的运行期特性, 可以领开发者安全使用的弱引用, 这就是 weak 属性特质, 他与 unsafe_unretained 的作用完全是等价的, 然而,只要系统吧属性回收,属性值就会自动设为 nil,

当指向属性实例的引用移除后, unsafe_unretained 属性仍然指向那个已经移除的实例, weak 属性则指向 nil.

一般来说,使用weak 比使用 unsafe_unreatained 更加安全.

如果不拥有某个对象,那就不要保留它.

总结: 将某些引用设为 weak. 可以避免出现 '保留环' (死循环);

weak 引用可以自动清空, 也可以不自动清空,自动清空是随着 ARC 而引入的新特性,由运行期系统来实现, 在具备自动清空功能的弱引用上, 可以随意读取其数据, 因为这种引用不会指向已经回收过的数据

相关文章

  • iOS -- 弱引用(20)

    以 弱引用 避免保留环 (死循环) 对象图里面经常出现一种情况,就是几个对象都以某种方式互相引用,从而形成'环',...

  • iOS Runtime 数据结构

    ios内存布局 内存管理方案 数据结构 ARC & MRC 引用计数 弱引用 自动释放池 循环引用 ios内存布...

  • iOS 基础篇 - 强引用与弱引用

    文章概要: (1)在这篇文章主要介绍了iOS的强引用与弱引用的差别。 (2)在文章中使用案例介绍强引用与弱...

  • iOS基础-弱引用

    实现弱引用 本文将整理 弱引用、强引用的定义 为什么会出现“弱引用” weak 实现原理 实现弱引用的N种方法 如...

  • ios-弱引用

    在了解弱引用之前,需要先了解散列表的知识 ios-散列表[https://www.jianshu.com/p/91...

  • iOS强引用与弱引用

    最近在复习iOS内存管理相关的知识,网上找了些资料顺便汇总下。 首先说一些基础性的东西: 1.强引用 在ARC中修...

  • (IOS)强引用与弱引用

    1.强引用 在ARC中修饰符是__strong,比如 __strong NSObject *obj; 不加修饰符的...

  • NSFoundation weak collection

    从iOS 6.0开始,系统提供了NSPointerArray,用于保存弱引用的指针。 示例

  • iOS ,内存分布、内存管理 、isa 指针,散列表(引用计数表

    iOS ,内存分布、内存管理 、isa 指针,散列表(引用计数表,弱引用表) 内存管理方案 1.taggedPoi...

  • ios中的强引用,弱引用

    强引用一个弱引用的对象 依旧是强引用 例如,数组, 字典。 想要变成弱引用可以使用NSValue的2个方法val...

网友评论

      本文标题:iOS -- 弱引用(20)

      本文链接:https://www.haomeiwen.com/subject/bdrvyxtx.html