runtime如何实现week功能
* week修饰的对象实际上是实现了一种“非拥有关系”,为这种week修饰的属性设置新的值时,设置方法即不保留新的值,也不释放旧的值
这种属性与assign类似,当属性所指的对象被销毁的时候,属性值也会清空(nil)
不同的是,runtime会实现week变量的自动置空
当有week对象注册时,就会把week对象放在一个hash表中,把week指向的对象(week对象赋值的对象,week对象=指向的对象)的内存地址作为key,
所有指向内存地址的week对象的内存地址为值value,当week属性指向的对象被销毁时,属性值自动值nil
例如
@property (nonatomic, weak) A *a;B类中
C *c = 【【c alloc】init】;
a=c;
以上栗子中
a=c;a是week对象,
把week指向的对象(c)的内存地址作为key,所有指向内存地址的week对象(a)的内存地址为值value,执行
objc_initWeak(&obj1, obj);方法
当week属性指向的对象(c)被销毁时,属性值(a)自动置nil,执行
objc_destroyWeak(&obj1);方法
*关于初始化initweak方法
objc_initWeak
函数的实现是这样的:在将“附有weak修饰符的变量(obj1)”初始化为0(nil)后,会将“赋值对象”(obj)作为参数,调用objc_storeWeak
函数。
obj1 = 0;
obj_storeWeak(&obj1, obj);
也就是说:
weak 修饰的指针默认值是 nil (在Objective-C中向nil发送消息是安全的)
然后obj_destroyWeak
函数将0(nil)作为参数,调用objc_storeWeak
函数。
objc_storeWeak(&obj1, 0);
objc_storeWeak
函数把第二个参数--赋值对象(obj)的内存地址作为键值,将第一个参数--weak修饰的属性变量(obj1)的内存地址注册到 weak 表中。如果第二个参数(obj)为0(nil),那么把变量(obj1)的地址从 weak 表中删除,