场景:
在objective-c中给分类添加属性时,不能直接添加getter,setter函数。这时可以利用runtime进行添加settet,getter函数。
.h文件
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface NSObject (Person)
//添加一个新属性
@property(nonatomic,copy)NSString *urlString;
- (void)clearAssociatedObjcet;
@end
NS_ASSUME_NONNULL_END
.m文件 @selector(urlString) 作为key
#import "NSObject+Person.h"
#import <objc/runtime.h>
@implementation NSObject (Person)
//添加一个自定义方法,用于清除所有关联属性
- (void)clearAssociatedObjcet{
objc_removeAssociatedObjects(self);
}
- (void)setUrlString:(NSString *)urlString {
objc_setAssociatedObject(self, @selector(urlString), urlString, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)urlString {
return objc_getAssociatedObject(self, @selector(urlString));
}
@end
.m文件 手动设置key
#import "NSObject+Person.h"
#import <objc/runtime.h>
static NSString *nameKey = @"nameKey"; //urlString对应的key
@implementation NSObject (Person)
//添加一个自定义方法,用于清除所有关联属性
- (void)clearAssociatedObjcet{
objc_removeAssociatedObjects(self);
}
- (void)setUrlString:(NSString *)urlString {
objc_setAssociatedObject(self, &nameKey, urlString, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)urlString {
return objc_getAssociatedObject(self, &nameKey);
}
@end
网友评论