Category中添加属性

Category中添加属性

在Category中添加属性,只会生成set,get方法的声明,不会生成方法的实现和声明成员变量

添加关联对象

用法

1
2
3
4
5
6
// 添加关联对象
objc_setAssociatedObject(id object, const void * key, id value, objc_AssociationPolicy policy)
// 获得关联对象
objc_getAssociateObject(id object, const void * key)
// 移除所有的关联对象
void objc_removeAssociateObjects(id object)

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#import <objc/runtime.h>
// 加static 使作用域仅限当前文件
static const void *nameKey = &nameKey;

@implementation SomeClass (Test)
- (void)setName:(NSString *)name {
// key 也可使用 "name", @selector(name)
objc_setAssociatedObject(self, nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name{
return objc_getAssociateObject(self, nameKey);
}
@end

关联对象的原理

实现关联对象技术的核心对象

  • AssociationsManager(关联对象Manager)
  • AssociationsHashMap(以Object作为Key,值为ObjectAssociationMap类型)
  • ObjectAssociationMap(存储某个Object所关联的对象,key是void *,值为ObjcAssociation类型)
  • ObjcAssociation(存储着policy和value)