标签:
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];
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 }; |
name
注意,并不是category小括号里写的名字,而是类的名字cls
要扩展的类对象,编译期间这个值是不会有的,在app被runtime加载时才会根据name
对应到类对象instance_methods
这个category所有的-
方法class_methods
这个category所有的+
方法protocols
这个category实现的protocol,比较不常用在category里面实现协议,但是确实支持的properties
这个category所有的property,这也是category里面可以定义属性的原因,不过这个property不会@synthesize
实例变量,一般有需求添加实例变量属性时会采用objc_setAssociatedObject
和objc_getAssociatedObject
方法绑定方法绑定,不过这种方法生成的与一个普通的实例变量完全是两码事。标签:
原文地址:http://blog.csdn.net/pjk1129/article/details/44981747