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;
    }
    在北京的灯中,有一盏是我家的。这个梦何时可以实现?哪怕微微亮。北京就像魔鬼训练营,有能力的留,没能力的走……
  • 相关阅读:
    3种Java从文件路径中获取文件名的方法
    win10系统下点击关机却自动重启的问题解决思路
    Eclipse窗口总是在最前的解决办法
    tomcat端口被占用
    js页面跳转整理(转载未整理)
    java.lang.IllegalArgumentException 不合法的参数异常
    MySQL如何查询两个日期之间的记录
    web -- 前端访问后台跨区问题解决
    Maven -- 发布jar包至远程仓库
    5 -- Hibernate的基本用法 --4 3 JDBC连接属性
  • 原文地址:https://www.cnblogs.com/huangzs/p/14479408.html
Copyright © 2011-2022 走看看