这里通过用关联对象(实际上就是Runtime的几个Api)达到给分类添加成员变量的效果
分类里定义属性,不会生成下划线成员变量,生成的set和get方法也只有声明没有实现
关联对象提供了以下API
- 添加关联对象
void objc_setAssociatedObject(id object, const void * key, id value, objc_AssociationPolicy policy)
- 获得关联对象
id objc_getAssociatedObject(id object, const void * key)
- 移除所有的关联对象
void objc_removeAssociatedObjects(id object)
第1个api的参数objc_AssociationPolicy policy:
关联对象的原理
这里的第一个参数object是实例对象
关联对象运用
@implementation MJPerson (Test)
- (void)setName:(NSString *)name
{
objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)name
{
// 隐式参数
// _cmd == @selector(name)
return objc_getAssociatedObject(self, _cmd);
}
网友评论