iOS 分类(Category)里添加weak对象属性

核心思想

  • 分类里添加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;
}

你可能感兴趣的:(iOS 分类(Category)里添加weak对象属性)