通过 Category 给已有的类添加成员变量

---声明---
#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 的修饰关键字。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。