OC中的Category添加成员变量

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容