转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639341
本文主要讲解runtime相关知识,从原理到实践,由于包含内容过多分为以下五篇文章详细讲解,可自行选择需要了解的方向:
本文是系列文章的第五篇文章,也是系列文章的最后一篇从runtime开始: 深入weak实现机理,本文主要讲解runtime是如何实现weak修饰符的。 
weak修饰符我们一点也不陌生在开发中经常用到,最主要的作用是为了防止引用循环(retained cycle),经常用于block和delegate,在前面几篇文章中已经讲解了weak的基本使用和引用循环,如果有兴趣可以参考文章iOS @property探究(一): 基础详解、iOS @property探究(二): 深入理解、iOS block探究(一): 基础详解、iOS block探究(二): 深入理解,相关方法和特点本文不再赘述了。
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代码来看看具体实现细节,有兴趣的读者可以继续阅读。
由于作者水平有限,难免出现纰漏,如有问题还请不吝赐教。
iOS runtime探究(五): 从runtime开始深入weak实现机理
原文:http://blog.csdn.net/u014205968/article/details/67639341