在<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
网友评论