我们都知道Category中只能新添加方法,而不能新添加成员变量。如果添加属性@property的话,只会生成getter和setter方法,不会生成成员变量,@synthesize合成方法也是不可以用的。这样的属性一旦调用系统当然毫不犹豫的崩...
那么如果硬要在Category中添加属性呢(⊙﹏⊙)b?
此时就需要借助runtime动态关联属性了
两个runtime里非常重要的函数,可用于动态关联对象
objc_setAssociatedObject
objc_getAssociatedObject
第一个参数为所要关联的对象,第二个参数为KEY值(通常使用静态全局变量,保证key值唯一),第三个参数为绑定的Value值,第四个参数为属性修饰(指定内存管理方式)
objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)
有这两个函数就OK了,下面在Category的getter和setter方法中利用runtime来动态绑定数据
#import "NSObject+WXM.h"
//导入runtime头文件
#import <objc/runtime.h>
@implementation NSObject (WXM)
//声明手写getter、setter
@dynamic name;
- (void)setName:(NSString *)name{
//利用运行时实现动态绑定数据
objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString *)name{
return objc_getAssociatedObject(self, @selector(name));
}
@selector(name)也可以使用任意字符串,保证key值对应即可
此方法可解除对象的动态关联
//移除指定对象关联的所有对象
objc_removeAssociatedObjects(self);
好了,现在再去调用点方法调用Category新添加的属性就不会报错啦!
runtime又一次以他强大的实力证明了他BUG般的存在!
这一期就到这里了,亲们有什么意见和问题记得及时反馈哦,喜欢的话点个关注给个赞(づ ̄3 ̄)づ╭❤~
我们下期再会