利用runtime来实现给分类添加属性

2018-11-20  本文已影响1人  guoguojianshu

在<objc/runtime.h>中定义了三个关联对象的方法,可以允许你把任何键值关联到运行的对象上

·objc_setAssociatedObject
.objc_getAssociatedObject
.objc_removeAssociatedObjects

通常推荐添加的属性是static char 类型的,但是更推荐指针类型的

static char类型的例子

#import "ViewController.h"

NS_ASSUME_NONNULL_BEGIN

@interface ViewController (associate)
@property (nonatomic,copy)NSString * type;
@end

NS_ASSUME_NONNULL_END
#import "ViewController+associate.h"
#import <objc/runtime.h>
static const char key ;
@implementation ViewController (associate)
-(NSString *)type{
    return objc_getAssociatedObject(self, &key);
}
-(void)setType:(NSString *)type{
    objc_setAssociatedObject(self, &key, type, OBJC_ASSOCIATION_RETAIN);
}
@end

使用指针的情况,只是.m的文件设置的key进行了改变

#import "ViewController+associate.h"
#import <objc/runtime.h>
static const char *key = "key";
@implementation ViewController (associate)
-(NSString *)type{
    return objc_getAssociatedObject(self, key);
}
-(void)setType:(NSString *)type{
    objc_setAssociatedObject(self, key, type, OBJC_ASSOCIATION_RETAIN);
}
@end

当然最最简单的方式是使用@selector,_cmd在Objective-C的方法中表示当前方法的selector

#import "ViewController+associate.h"
#import <objc/runtime.h>
@implementation ViewController (associate)
-(NSString *)type{
    return objc_getAssociatedObject(self, _cmd);
}
-(void)setType:(NSString *)type{
    objc_setAssociatedObject(self, @selector(type), type, OBJC_ASSOCIATION_RETAIN);
}
@end

关联对象的行为

属性可以根据定义在枚举类型 objc_AssociationPolicy 上的行为被关联在对象上:


屏幕快照 2018-11-20 上午11.19.54.png

删除属性

你不能手动调用这个函数 objc_removeAssociatedObjects,文档中提到,如果想删除一个属性,可以给这个属性nil

上一篇下一篇

猜你喜欢

热点阅读