---声明---
#import <Foundation/Foundation.h>
@interface NSObject (Name)
@property (nonatomic, strong) NSString *name;
@end
---实现---
#import "NSObject+ Name.h"
#import <objc/message.h>
@implementation NSObject (Name)
- (NSString *)name {
// 利用参数key 将对象object中存储的对应值取出来
return objc_getAssociatedObject(self, @"name");
}
- (void)setName:(NSString *)name {
// 将某个值跟某个对象关联起来,将某个值存储到某个对象中
objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
---调用---
NSObject *objc = [[NSObject alloc]init];
objc.name = @"set name";
NSLog(@"runtime 动态添加属性:%@", objc.name);
---输出---
runtime 动态添加属性:set name
我们成功在分类上添加了一个属性,实现了它的 setter 和 getter 方法。 通过关联对象实现的属性的内存管理也是有 ARC 管理的,所以我们只需要给定适当的内存策略就行了,不需要操心对象的释放。
这里用到了两个方法:
id objc_getAssociatedObject(id object, const void *key);
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
object: 被关联的对象。
key: 关联的 key 值,要求唯一。
value: 关联的对象。
objc_AssociationPolicy: 内存管理策略。可以理解为 property 的修饰关键字。