weak引用什么时候变为nil?

在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的开发中,代码的安全和简洁往往比性能更重要。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容