1.何为weak?
weak 是oc中定义对象属性property时用于修饰对象属性的关键字。
2.weak有什么用处?
weak是弱引用,用weak修饰的对象计数器不会加1,并且在对象被释放时自动置为nil,大大避免了野指针访问导致崩溃的问题;另外weak还可用于解决delegate的循环引用;自定义的IBOutlet对象也使用weak(因为subviews数组已经对该对象进行了强引用,不需要再对其进行强引用了)。
3.weak的实现原理?
weak表是一个hash表,key指向对象的地址,value指向weak指针的地址数组(对象可能被多个weak指针弱引用);
runtime机制来维护这个hash表,详细步骤如下:
第一步:初始化时,runtime调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址;
第二步:添加引用时,objc_initWeak函数会调用objc_storeWeak函数更新指针的指向,创建对应的弱引用表;
第三步:释放时,调用clearDeallocating函数:根据key(对象的地址),找到对应的value(指向该对象的所有weak指针的地址数组),遍历这个数组,把所有的weak指针置为nil;最后删除weak表,清理对象记录.
当对象的引用计数为0时,调用dealloc函数,以对象的内存地址为key,到hash表中找到对应的存放weak指针地址的数组,遍历数组,并将weak指针置为nil;最后删除hash表,清理对象记录.
参考链接:http://www.cocoachina.com/ios/20170328/18962.html