Category能否添加成员变量?
不能直接给Category添加成员变量,但能间接实现成员变量的效果。能直接添加属性。添加的属性,只能生成getter、setter方法的声明,不能生成方法的实现,也不能生成相应的成员变量。
通过runtime关联对象
- 关联对象并不是存储在被关联对象本身内存中
- 关联对象存储在全局统一的一个AssociationsMapManager中,通过AssociationsHashMap来存储
- 设置关联对象为nil,就相当于是移除关联对象
- objc_removeAssociatedObjects(id):移除id对象所关联的所有对象
- 当对象销毁后,所有被关联的对象也会被释放
XX_category.h
#import "QSPerson.h"
NS_ASSUME_NONNULL_BEGIN
@interface QSPerson (Property)
/** 姓名 */
@property (nonatomic ,copy) NSString *name;
@end
NS_ASSUME_NONNULL_END
XX_category.m
#import "QSPerson+Property.h"
#import <objc/runtime.h>
@implementation QSPerson (Property)
- (void)setName:(NSString *)name
{
/**
@object 被关联的对象
@key 关联的key
@value 关联的值
@policy 政策、策略,对应修饰符
*/
objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)name
{
// 隐式参数 _cmd = @selector(name)
return objc_getAssociatedObject(self, _cmd);
}
@end
底层数据结构图:
截屏2020-07-16 下午3.32.53.png













网友评论