程序员人生 网站导航

如何为类别增加变量?

栏目:综合技术时间:2015-04-24 08:10:17

Category 是Objective-C 里面最经常使用到的功能之1。Category 可以为已存在的类增加方法,而不需要增加1个子类。而且,我们可以在不知道某个类内部实现的情况下,为该类增加方法。

注意:种别其实不能为类声明新的实例变量,他只包括方法。

此篇文章要通过种别为类增加变量,不多说了,直接上代码吧:

通过runtime实现以下代码:

static constchar *durationKey = "duration";

- (int)getDurationTime{

    return [objc_getAssociatedObject(self, &durationKey) intValue];

}

- (void)setDurationTime:(int)duration{

    objc_setAssociatedObject(self, &durationKey, [NSNumber numberWithInt:duration], OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}


调用方式: [selfgetDurationTime];


Category的真面目

objc所有类和对象都是c结构体,category固然也1样,下面是runtime中category的结构:

1 2 3 4 5 6 7 8
struct _category_t { const char *name; // 1 struct _class_t *cls; // 2 const struct _method_list_t *instance_methods; // 3 const struct _method_list_t *class_methods; // 4 const struct _protocol_list_t *protocols; // 5 const struct _prop_list_t *properties; // 6 };

  1. name注意,其实不是category小括号里写的名字,而是类的名字
  2. cls要扩大的类对象,编译期间这个值是不会有的,在app被runtime加载时才会根据name对应到类对象
  3. instance_methods这个category所有的-方法
  4. class_methods这个category所有的+方法
  5. protocols这个category实现的protocol,比较不经常使用在category里面实现协议,但是确切支持的
  6. properties这个category所有的property,这也是category里面可以定义属性的缘由,不过这个property不会@synthesize实例变量,1般有需求添加实例变量属性时会采取objc_setAssociatedObjectobjc_getAssociatedObject方法绑定方法绑定,不过这类方法生成的与1个普通的实例变量完全是两回事。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐