关联对象的如何进行内存管理的?关联对象如何实现weak属性

1, 关联对象的ObjectAssociation中有两个属性(uintptr_t _policy, id value),
_policy 包含 retain, assgin copy, 会对应的对对象进行和普通对象一样的内存管理操作.

2 ,实现weak,用__weak修饰对象,并将其用block包裹,关联时,关联block对象

-(void)setWeakvalue:(NSObject *)weakvalue {
    __weak typeof(weakvalue) weakObj = weakvalue;
    typeof(weakvalue) (^block)() = ^(){
        return weakObj;
    };
    objc_setAssociatedObject(self, weakValueKey, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSObject *)weakvalue {
    id (^block)() = objc_getAssociatedObject(self, weakValueKey);
    return block();
}

3.额外创造一个类WeakObjectContainer,在这个类里实现weak属性 weakObject ,虽然 分类里 retain 了一个 WeakObjectContainer,但是 WeakObjectContainer 最终会随着属性的持有对象一起销毁,不存在泄露。

WeakObjectContainer.h

@property (nonatomic, readonly, weak) id weakObject;
- (instancetype)initWithWeakObject:(id)object;

WeakObjectContainer.m

- (instancetype)initWithWeakObject:(id)object {
    self = [super init];
    if (self) {
        _weakObject = object;
    }
    
    return self;
}

NSObject+AssociateWeak.h

@property(weak, nonatomic) NSObject *weakObject;

NSObject+AssociateWeak.m

首先导入头文件

#import <objc/runtime.h>
#import "WeakObjectContainer.h"
NSString const *kKeyWeakObject = @"kKeyWeakObject";
-(void)setWeakObject:(NSObject *)weakObject
{
    WeakObjectContainer *container = [[WeakObjectContainer alloc] initWithWeakObject:weakObject];
    objc_setAssociatedObject(self, &kKeyWeakObject, (id)container, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSObject *)weakObject
{
    WeakObjectContainer *container = objc_getAssociatedObject(self, &kKeyWeakObject);
    return container.weakObject;
}
在北京的灯中,有一盏是我家的。这个梦何时可以实现?哪怕微微亮。北京就像魔鬼训练营,有能力的留,没能力的走……
原文地址:https://www.cnblogs.com/huangzs/p/14479408.html