美文网首页
weak引用什么时候变为nil?

weak引用什么时候变为nil?

作者: 光明自在 | 来源:发表于2018-03-27 10:25 被阅读21次

在iOS的开发中,weak引用是经常使用的一个特性,常用在像delegate这种需要相互引用的场景,以避免循环引用。

我们都知道,当weak引用的对象释放之后,weak引用会变为nil,那么具体是什么时候变为nil的?

你可能会不假思索的说,在被引用的对象dealloc/deinit的时候。这当然没错,那么是在dealloc/deinit开始还是结束的时候呢?

先说答案:开始的时候。

原因:

我查了很多资料,什么weak的实现原理,什么weak的底层逻辑,都没有找到确切的说法。

如果哪位朋友有确切的理论支持,希望不吝赐教。

我的猜测:在对象dealloc/deinit开始之后,对于外部对象来说,应该认为此对象已经无效。

有什么用呢?

假设我们要实现一个weak引用target对象的NotificationCenter,那么在target对象的dealloc/deinit中移除对Notificatino的监听就是无效的,因为一旦dealloc/deinit开始调用,NotificationCenter中target的引用就已经为nil了。NotificationCenter需要在适当的时机移除无效的target。

感兴趣的童鞋可以看一下ReSwift的Store实现。

提示

weak相对strong来说,会消耗更多的系统资源,但是也极大的提高了编程的安全性和方便性(比如上面的例子,target对象根本不需要手动取消监听)。

在手机性能越来越高的背景下,牺牲一点儿性能换来代码的安全和简洁是值得的。weak的底层实现用的是类似HashMap这样的数据结构,效率还是非常高的,没有必要过于担心性能。对于之前有C++或服务器开发背景的童鞋,尤其需要注意这一点儿,在app的开发中,代码的安全和简洁往往比性能更重要。

相关文章

  • weak引用什么时候变为nil?

    在iOS的开发中,weak引用是经常使用的一个特性,常用在像delegate这种需要相互引用的场景,以避免循环引用...

  • RxSwift-内存管理

    一、循环引用 weak:弱引用,[weak self],需要解包操作,延迟调用为nil不崩溃 unowned:无主...

  • weak和assign、__block和__weak

    weak:在MRC是没有weak的,在ARC中,weak用于修饰对象,计数不变,不引用后为nil。 assign:...

  • 给自己出的iOS面试题

    面试题: weak修饰的对象如何被自动置为nil? strong修饰的对象在引用计数变为0时,是实时销毁的吗? a...

  • iOS 内存管理面试题(`__weak` 属性修饰的变量,如何实

    __weak 属性修饰的变量,如何实现在变量没有强引用后自动置为 nil ? 用的弱引用 - weak表。也是一张...

  • IOS 关键字

    一、定义 weak:简单来讲是弱引用。引用计数器不会加一,只能修饰对象 ,对象释放后,指针为nil,对nil 访问...

  • weak与assign

    weak关键字的作用是弱引用,所引用对象的计数不会增加,并在引用对象释放的时候自动被置为nil weak是有run...

  • iOS底层weak的实现原理

    weak是弱引用,所引用对象的计数器不会加一,并在引用对象被释放的时候自动被设置为nil。那么weak的原理是什么...

  • 性能优化3

    循环引用 解决办法 weak 在调用过程中 发现有时打印为nil,是因为用weak修饰的weakSelf是弱引用 ...

  • @property关键字

    1.weak: weak,弱指针,不会让引用计数器+1,如果指向对象被销毁,指针会自动置nil weak原理: r...

网友评论

      本文标题:weak引用什么时候变为nil?

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