Runtime面试之weak
栏目: Objective-C · 发布时间: 6年前
内容简介:参考自《Objective-C高级编程》一书当我们初始化一个weak变量时,runtime会调用 NSObject.mm 中的objc_initWeak函数。通过
参考自《Objective-C高级编程》一书
1.初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。
{
NSObject *obj = [[NSObject alloc] init];
id __weak obj1 = obj;
}
复制代码
当我们初始化一个weak变量时,runtime会调用 NSObject.mm 中的objc_initWeak函数。
// 编译器的模拟代码 id obj1; objc_initWeak(&obj1, obj); /*obj引用计数变为0,变量作用域结束*/ objc_destroyWeak(&obj1); 复制代码
通过 objc_initWeak
函数初始化“附有weak修饰符的变量(obj1)”,在变量作用域结束时通过 objc_destoryWeak
函数释放该变量(obj1)。
2.添加引用时:objc_initWeak函数会调用objc_storeWeak() 函数, objc_storeWeak() 的作用是更新指针指向,创建对应的弱引用表。
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); 复制代码
前面的源代码与下列源代码相同。
// 编译器的模拟代码 id obj1; obj1 = 0; objc_storeWeak(&obj1, obj); /* ... obj的引用计数变为0,被置nil ... */ objc_storeWeak(&obj1, 0); 复制代码
objc_storeWeak
函数把第二个参数的赋值对象(obj)的内存地址作为键值,将第一个参数__weak修饰的属性变量(obj1)的内存地址注册到 weak 表中。如果第二个参数(obj)为0(nil),那么把变量(obj1)的地址从weak表中删除。
由于一个对象可同时赋值给多个附有__weak修饰符的变量中,所以对于一个键值,可注册多个变量的地址。
可以把 objc_storeWeak(&a, b)
理解为: objc_storeWeak(value, key)
,并且当key变nil,将value置nil。在b非nil时,a和b指向同一个内存地址,在b变nil时,a变nil。此时向a发送消息不会崩溃:在Objective-C中向nil发送消息是安全的。
3.释放时,调用clearDeallocating函数。clearDeallocating函数首先根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。
当weak引用指向的对象被释放时,又是如何去处理weak指针的呢?当释放对象时,其基本流程如下:
1.调用objc_release
2.因为对象的引用计数为0,所以执行dealloc
3.在dealloc中,调用了_objc_rootDealloc函数
4.在_objc_rootDealloc中,调用了object_dispose函数
5.调用objc_destructInstance
6.最后调用objc_clear_deallocating
对象被释放时调用的objc_clear_deallocating函数:
1.从weak表中获取废弃对象的地址为键值的记录
2.将包含在记录中的所有附有 weak修饰符变量的地址,赋值为nil
3.将weak表中该记录删除
4.从引用计数表中删除废弃对象的地址为键值的记录
总结:
其实Weak表是一个hash(哈希)表,Key是weak所指对象的地址,Value是weak指针的地址(这个地址的值是所指对象指针的地址)数组。
备注:更深一层的讲解,请参考:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Python面试经验总结,面试一时爽,一直面试一直爽!
- 算法面试:数组编码面试问题
- 【面试虐菜】—— JAVA面试题(1)
- 如何面试-作为面试官得到的经验
- PHP面试之网络协议面试题
- 如何克服面试紧张心理 ?(面试答题篇Ⅲ)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Designing for Emotion
Aarron Walter / Happy Cog / 2011-10-18 / USD 18.00
Make your users fall in love with your site via the precepts packed into this brief, charming book by MailChimp user experience design lead Aarron Walter. From classic psychology to case studies, high......一起来看看 《Designing for Emotion》 这本书的介绍吧!