码迷,mamicode.com
首页 > 其他好文 > 详细

如何为类别增加变量?

时间:2015-04-10 17:58:01      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

通过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当然也一样,下面是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实例变量,一般有需求添加实例变量属性时会采用objc_setAssociatedObjectobjc_getAssociatedObject方法绑定方法绑定,不过这种方法生成的与一个普通的实例变量完全是两码事。

如何为类别增加变量?

标签:

原文地址:http://blog.csdn.net/pjk1129/article/details/44981747

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!