zoukankan      html  css  js  c++  java
  • 关联对象的如何进行内存管理的?关联对象如何实现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;
    }
    在北京的灯中,有一盏是我家的。这个梦何时可以实现?哪怕微微亮。北京就像魔鬼训练营,有能力的留,没能力的走……
  • 相关阅读:
    Web网页配色方案及安全色谱
    JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
    IE8的css hack
    jquery 获取元素坐标
    CSS 颜色值
    正则表达式
    JS获取宽度
    常用正则表达式例子
    HTML转义字符
    myeclipse 10.0 含破解补丁/注册机
  • 原文地址:https://www.cnblogs.com/huangzs/p/14479408.html
Copyright © 2011-2022 走看看