iOS黑科技【底层技术篇-1】 利用Runtime为Category添加属性

我们都知道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 

@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 ̄)づ╭❤~
我们下期再会

你可能感兴趣的:(iOS黑科技【底层技术篇-1】 利用Runtime为Category添加属性)