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

 

转载于:https://www.cnblogs.com/ddavidXu/p/6382896.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值