美文网首页
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