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 表中删除, 

 

posted @ 2017-05-03 09:24  ddavidXu  阅读(385)  评论(0编辑  收藏  举报