• 关联对象的如何进行内存管理的?关联对象如何实现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;
    }
    在北京的灯中,有一盏是我家的。这个梦何时可以实现?哪怕微微亮。北京就像魔鬼训练营,有能力的留,没能力的走……
  • 相关阅读:
    Windows 编程,程序编译使用的命令行工具。
    showmemory.c 和 hello.s 源码
    jps命令
    A亚马逊WS网上系列讲座——怎么样AWS云平台上千万用户的应用建设
    Android比较字符串是空的(isEmpty)
    NSDictionary、NSMutableDictionary基本使用
    写贤治学生:关键是要管理好自己的时间
    Spark SQL Catalyst源代码分析Optimizer
    leetcode
    SQL Server 权限管理
  • 原文地址:https://www.cnblogs.com/huangzs/p/14479408.html
Copyright © 2020-2023  润新知