iOS關聯對象

關聯對象API

  • 添加關聯對象
void objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key,
                         id _Nullable value, objc_AssociationPolicy policy)
  • 獲得關聯對象
id _Nullable objc_getAssociatedObject(id _Nonnull object,
									 const void * _Nonnull key)
  • 移除所有的關聯對象
void objc_removeAssociatedObjects(id _Nonnull object)

關聯的引用

typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
    OBJC_ASSOCIATION_ASSIGN = 0,          
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,  
    OBJC_ASSOCIATION_RETAIN = 01401,       
    OBJC_ASSOCIATION_COPY = 01403         
};

key的用法

1

- (void)setName:(NSString *)name
{
    objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name
{
    return objc_getAssociatedObject(self, @"name")
}

2

static const char CMJNameKey;
- (void)setName:(NSString *)name
{
    objc_setAssociatedObject(self, &CMJNameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name
{
    return objc_getAssociatedObject(self, &CMJNameKey)
}

3

 - (void)setName:(NSString *)name
{
    objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

 - (NSString *)name
{
    return objc_getAssociatedObject(self, @selector(name));
}

關聯對象的原理

實現關聯對象技術的核心對象有

  • AssociationsManager
  • AssociationsHashMap
  • ObjectAssociationMap
  • ObjcAssociation

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章