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];
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
};
|
name
注意,其实不是category小括号里写的名字,而是类的名字cls
要扩大的类对象,编译期间这个值是不会有的,在app被runtime加载时才会根据name
对应到类对象instance_methods
这个category所有的-
方法class_methods
这个category所有的+
方法protocols
这个category实现的protocol,比较不经常使用在category里面实现协议,但是确切支持的properties
这个category所有的property,这也是category里面可以定义属性的缘由,不过这个property不会@synthesize
实例变量,1般有需求添加实例变量属性时会采取objc_setAssociatedObject
和objc_getAssociatedObject
方法绑定方法绑定,不过这类方法生成的与1个普通的实例变量完全是两回事。上一篇 网络框架Volley原理分析
下一篇 struts2标签截取字符串