weak
是runtime
维护的一个hash
表,用于存储指向某一个对象的所有指针。weak
表其实是一个hash
表,key
是所指对象的指针,value
是weak
指针的地址(这个地址的值是所指对象指针的地址)数组。
- 初始化时:
runtime
会调用objc_initWeak
函数,初始化一个新的weak
指针指向对象的地址。 - 添加引用时:
objc_initWeak
函数会调用objc_storeWeak()
函数,objc_storeWeak()
的作用是更新指针的指向,创建对应的弱引用表。 - 释放时:调用
clearDeallocating
函数。clearDeallocating
函数首先根据对象地址获取所有weak
指针地址的数组,然后遍历这个数组把其中的数据设为nil
,最后把这个entry
从weak
表中删除,最后清理对象的记录。
runtime如何实现weak变量的自动置nil?
runtime
对注册的类,会进行布局,对于weak
对象会放入一个hash
表中,用weak
所指向的对象内存地址作为key
,当此对象的引用计数为0的时候会dealloc
,假如weak
指向的对象内存地址是a,那么就会以a为键,在这个weak
表中搜索,找到所有以a为键的weak
对象,从而设置为nil
。