核心思想
分类里添加Weak 属性用block实现,也可以用一个对象实现,associate这个block/对象,这个block/object 弱引用需要关联的对象,间接实现weak目标对象。
关联属性 === 中间对象/Block --- 目标对象 (===为强引用,--- 为弱引用)
实现原理
- 在分类dealloc的时候,会释放关联的retain的block/对象,这个block/对象会正常被释放不会造成循环饮用。
- 内部weak持有的属性,在引用对象被释放的时候,这个weak指针会被置为nil,虽然包装层的block/对象还在,但是不影响使用,也不影响循环引用。
Block实现的代码
typedef id weakid;
typedef weakid(^WeakReference)(void);
WeakReference packWeakReference(id ref) {
__weak weakid weakRef = ref;
return ^{
return weakRef;
};
}
weakid unpackWeakReference(WeakReference closure) {
return closure ? closure() : nil;
}