美文网首页
ios 分类中如何添加数据成员

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

作者: Coder大雄 | 来源:发表于2016-08-22 23:22 被阅读61次

分类中可以声明属性,因为声明属性其实就是声明设置方法和获取方法。但是分类中不可以合成属性,因为合成属性其实就是创建实例变量。
虽然不能在分类中创建实例变量,但是可以创建关联引用(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的参数正确的处理复制、赋值、和保留语义。对象被收回的时候,关联引用会被正确的释放。

相关文章

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

    分类中可以声明属性,因为声明属性其实就是声明设置方法和获取方法。但是分类中不可以合成属性,因为合成属性其实就是创建...

  • iOS-浅谈OC中的关联对象

    目录 前言工作中遇到问题的思考---- 直接在分类添加成员变量---- 在分类中增加属性如何在分类中添加成员变量?...

  • Category分类添加成员变量

    思考:如何实现给分类“添加成员变量”? 默认情况下,因为分类底层结构的限制,不能添加成员变量到分类中。但可以通过关...

  • 探索关联对象的原理

    思考:如何实现给分类“添加成员变量”? 默认情况下,因为分类底层结构的限制,不能添加成员变量到分类中。但可以通过关...

  • iOS开发(8)关联对象

    思考:如何实现给分类“添加成员变量”? 默认情况下,因为分类底层结构的限制,不能添加成员变量到分类中。但可以通过关...

  • 关联对象

    如何实现给分类“添加成员变量”? 默认情况下,因为分类底层结构的限制,不能添加成员变量到分类中。可以通过关联对象来...

  • 关联对象-给分类“添加成员变量”

    思考:如何实现给分类“添加成员变量”? 默认情况下,因为分类底层结构的限制,不能添加成员变量到分类中。但可以通过关...

  • 关联对象

    分类中不能添加成员变量 默认情况下,因为分类底层结构的限制,分类中不能添加成员变量。如果强行添加会报错“Insta...

  • iOS 关联对象 Category间接添加成员变量

    iOS添加关联对象即可为分类间接添加成员变量 在分类中声明属性,只相当于声明了两个方法(set和get),不会生成...

  • Category关联对象

    一、分类中添加成员变量Category中添加成员变量.png 所以Category中是不能添加成员变量 二、Cat...

网友评论

      本文标题:ios 分类中如何添加数据成员

      本文链接:https://www.haomeiwen.com/subject/idpgsttx.html