首页 > 代码库 > iOS runtime探究(五): 从runtime开始深入weak实现机理
iOS runtime探究(五): 从runtime开始深入weak实现机理
你要知道的runtime都在这里
转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639341
本文主要讲解runtime
相关知识,从原理到实践,由于包含内容过多分为以下五篇文章详细讲解,可自行选择需要了解的方向:
- 从runtime开始: 理解面向对象的类到面向过程的结构体
- 从runtime开始: 深入理解OC消息转发机制
- 从runtime开始: 理解OC的属性property
- 从runtime开始: 实践Category添加属性与黑魔法method swizzling
- 从runtime开始: 深入weak实现机理
本文是系列文章的第五篇文章,也是系列文章的最后一篇从runtime开始: 深入weak实现机理,本文主要讲解runtime
是如何实现weak
修饰符的。
weak
修饰符我们一点也不陌生在开发中经常用到,最主要的作用是为了防止引用循环(retained cycle)
,经常用于block
和delegate
,在前面几篇文章中已经讲解了weak
的基本使用和引用循环,如果有兴趣可以参考文章iOS @property探究(一): 基础详解、iOS @property探究(二): 深入理解、iOS block探究(一): 基础详解、iOS block探究(二): 深入理解,相关方法和特点本文不再赘述了。
weak
weak
不论是用作property
修饰符还是用来修饰一个变量的声明其作用是一样的,就是不增加新对象的引用计数,被释放时也不会减少新对象的引用计数,同时在新对象被销毁时,weak
修饰的属性或变量均会被设置为nil
,这样可以防止野指针错误,本文要讲解的也正是这个特性,runtime
如何将weak
修饰的变量的对象在销毁时自动置为nil
。
那么runtime
是如何实现在weak
修饰的变量的对象在被销毁时自动置为nil
的呢?一个普遍的解释是:runtime
对注册的类会进行布局,对于weak
修饰的对象会放入一个hash表
中。用weak
指向的对象内存地址作为key
,当此对象的引用计数为0的时候会dealloc
,假如weak
指向的对象内存地址是a
,那么就会以a
为键在这个weak表
中搜索,找到所有以a
为键的weak
对象,从而设置为nil
。
了解了以上知识后就可以深入runtiem
代码来看看具体实现细节,有兴趣的读者可以继续阅读。
深入runtime理解weak
备注
由于作者水平有限,难免出现纰漏,如有问题还请不吝赐教。
iOS runtime探究(五): 从runtime开始深入weak实现机理