runtime源码探究(三)属性关联

本文深入探讨了Objective-C中objc_setAssociatedObject、objc_getAssociatedObject和objc_remove_associations的实现原理。讲解了属性关联如何在运行时动态添加对象属性,以及如何存储和检索关联值,包括对象的内存管理策略。同时指出在对象析构时,Apple自动处理了关联引用的释放。
摘要由CSDN通过智能技术生成

objc_setAssociatedObject

属性关联可以在运行时动态的给某个对象添加属性,来看objc_setAssociatedObject的实现:

void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) {
    _object_set_associative_reference(object, (void *)key, value, policy);
}

_object_set_associative_reference函数首先初始化了一个ObjcAssociation对象

 ObjcAssociation old_association(0, nil)

old_association用来存储关联的值和关联策略,默认是OBJC_ASSOCIATION_ASSIGN。接下来如果发现传入的value不为空,那么就对传入的value进retain或者copy操作(如果关联策略是OBJC_ASSOCIATION_SETTER_RETAIN或者OBJC_ASSOCIATION_SETTER_COPY)

id new_value = value ? acquireValue(value, policy) : nil;
//acquireValue函数的实现
static id acquireValue(id value, uintptr_t policy) {
    switch (policy & 0xFF) {
    case OBJC_ASSOCIATION_SETTER_RETAIN:
        return ((id(*)(id, SEL))objc_msgSend)(value, SEL_retain);
    case OBJC_ASSOCIATION_SETTER_COPY:
        return ((id(*)(id, SEL))objc_msgSend)(value, SEL_copy);
    }
    return value;
}

接下来初始化AssociationsManager,AssociationsManager里面主要是存在一个hash map,结构如下:

class AssociationsManager {
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值