iOS weak底层原理

         开发中,weak是弱引用,weak修改的对象引用计数不会加1,而且当对象销毁时候,会自动将对象指针置为nil,所以也就不会产生野指针了。 那么weak修饰的对象底层到底做了什么呢?

         首先weak底层其实是runtime,runtime维护一个全部weak修饰对象的一个hash表,其中hash表的key就是weak对象的地址,value就是指针的地址(为一个数组,因为一个对象可以被多个弱引指针用指向)。底层实现分为以下三步:

        1.首先初始化,调用objc_initWeak函数,创建一个新的weak指针指向对象的地址。

        2.引用的时候,objc_initWeak函数会调用objc_storeWeak函数,更新指针指向,创建对应的弱引用表。

        3.释放的时候,调用clearDeallocating函数,该函数会根据对象的地址,也就是hash表中的key,去找到对应的value,然后遍历置nil,然后从这个weak表中清空,最后清空对象记录。

          弄清楚了weak的原理,实践中就知道为什么代理我们一般用weak修饰,而不是assign修饰了吧。assign一般修饰基础数据类型,如果修饰对象的话,一般我们要手动将指针收到置nil,不然使用会产生野指针,如果在取操作该指针对应的对象就会crash了。原因就是assign修饰对象的时候,对象由于存在堆区,而指针存在栈区,对象释放后,系统不会将对应的指针清空,所以就会造成野指针。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容