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)