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