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

2016-08-22  本文已影响61人  Coder大雄

分类中可以声明属性,因为声明属性其实就是声明设置方法和获取方法。但是分类中不可以合成属性,因为合成属性其实就是创建实例变量。
虽然不能在分类中创建实例变量,但是可以创建关联引用(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

结束

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

上一篇下一篇

猜你喜欢

热点阅读