目的
在 NSObject
类中,添加 name
属性。
方案
利用 runtime
的相关方法:
- 动态添加属性
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
objc_AssociationPolicy
相关枚举值
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};
- 获得属性
objc_getAssociatedObject(id object, const void *key);
- 移除所有关联对象
objc_removeAssociatedObjects(id _Nonnull object);
实现
创建 NSObject
的分类 NSObject+DO
文件
NSObject+DO.h
文件:
#import <Foundation/Foundation.h>
@interface NSObject (DO)
/**
添加的 name 属性
*/
@property (nonatomic, copy) NSString *name;
@end
NSObject+DO.m
文件:
#import <objc/message.h>
#import "NSObject+DO.h"
@implementation NSObject (DO)
- (void)setName:(NSString *)name
{
objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)name
{
return objc_getAssociatedObject(self, @"name");
}
@end
ViewController.m
文件:
- (void)viewDidLoad {
[super viewDidLoad];
NSObject *objc = [[NSObject alloc] init];
objc.name = @"张三";
NSLog(@"NSObject ---- name:%@", objc.name);
}
输出结果:
NSObject ---- name:张三