ios 分类中如何添加数据成员

分类中可以声明属性,因为声明属性其实就是声明设置方法和获取方法。但是分类中不可以合成属性,因为合成属性其实就是创建实例变量。
虽然不能在分类中创建实例变量,但是可以创建关联引用(associative reference)。通过关联引用,你可以向任何对象中添加键-值(key-value)数据

举个例子

有一个Father类,这个Father类可能会在其他程序中使用。有的时候address这个字段有用,时候这个字段没用。一个比较好的办法就是使用分类为Father这个类添加一个名为address的属性,这样就可以避免不需要的时候开销。

首先看下Father
@interface Father : NSObject

@property (nonatomic,readwrite, copy) NSString *name;

@end
现在使用关联引用在分类中添加一个address的属性
#import <objc/runtime.h>

@interface Father (Address)

@property (nonatomic, readwrite, copy) NSString *address;

@end
@implementation Father (Address)

static char addressKey;

- (NSString *)address {
    return objc_getAssociatedObject(self, &addressKey);
}

- (void)setAddress:(NSString *)address {
    objc_setAssociatedObject(self, &addressKey,
                             address,
                             OBJC_ASSOCIATION_COPY);
}
@end
  • 可以看出,关联引用时基于键(key)内存地址的,而不是。在addressKey中存储的内容并不重要,但是它需要一个唯一的地址,所以通常使用一个未赋值的static char作为键。

结束

关联引用有一个非常好的内存管理机制,可以根据传给的setAssociatedObject的参数正确的处理复制、赋值、和保留语义。对象被收回的时候,关联引用会被正确的释放。

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

相关阅读更多精彩内容

友情链接更多精彩内容