weak & assign
-
weak
修饰对象
赋值方式:复制引用
对象销毁后自动置为nill
-
assign
修饰基本数据类型(也可以修饰对象)
赋值方式:赋值值
对象销毁后不会自动置为nill
,形成野指针
runtime是如何实现 weak 变量的自动置nil
-
runtime
对注册的类会进行布局,对于weak
修饰的对象会放入一个hash
表中。 - 用
weak
指向的对象内存地址作为key
,对象作为value
。 - 当此对象的引用计数为0的时候会
dealloc
,假如weak
指向的对象内存地址是a,那么就会以a为键在这个hash
表中搜索,找到所有以a为键的weak
对象,从而设置为nil
。
具体机制
objc_storeWeak(&weakPo, Model)函数:
可以把objc_storeWeak(&weakPo, Model)理解为:objc_storeWeak(value, key),并且当key变nil,将value置nil。
- objc_storeWeak函数把赋值对象(Model)的内存地址作为键值key,将weak修饰的属性变量(weakPo)的内存地址(& weakPo)作为value,注册到 weak 表中。
- 如果Model为0(nil),那么把变量(weakPo)的内存地址(& weakPo)从weak表中删除。
- 在Model非nil时,weakPo和Model指向同一个内存地址,在Model变nil时,weakPo变nil。此时向weakPo发送消息不会崩溃:在Objective-C中向nil发送消息是安全的。
网友评论