美文网首页
Effective Objective-C 2.0 第二章 十、

Effective Objective-C 2.0 第二章 十、

作者: Vergil_wj | 来源:发表于2019-05-05 14:09 被阅读0次

    我之前已经在这篇文章
    iOS runtime 关联对象做了详细介绍。本篇只是简单介绍下。

    创建关联对象:

    void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
    
    • id object:对象
    • const void *key:键
    • id value:值
    • objc_AssociationPolicy policy:内存管理策略

    其中内存管理策略是一个枚举,如下:

    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
    };
    

    获取关联对象:

    id objc_getAssociatedObject(id object, const void *key)
    

    删除关联对象:

    void objc_removeAssociatedObjects(id object)
    

    常用用法:给类别增加对象

    给 UILable 新增一个类别 UILable(vj):

    UILabel+vj.h:

    #import <UIKit/UIKit.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface UILabel (vj)
    
    @property(nonatomic,copy)NSString *name;
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    UILabel+vj.m

    #import "UILabel+vj.h"
    #import "objc/runtime.h"
    
    const void *kNameKey = @"namekey";
    
    @implementation UILabel (vj)
    
    -(NSString *)name{
       return objc_getAssociatedObject(self, kNameKey);
    }
    
    -(void)setName:(NSString *)name{
        objc_setAssociatedObject(self, kNameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    
    @end
    

    这样我们就为 UILabel (vj) 新增了 name 属性。

    一般我们也用不到关联对象这种写法,当我们需要在对象中存储额外信息时,一般继承一个子类,然后改用这个子类,这是最常用的写法。如非必要还是少用关联对象的写法吧,如果是由它引起的 bug 通常难以查找。

    相关文章

      网友评论

          本文标题:Effective Objective-C 2.0 第二章 十、

          本文链接:https://www.haomeiwen.com/subject/dlocoqtx.html