category的真面目
objc所有类和对象都是c结构体,category当然也一样,下面是runtime中category的结构:
struct_category_t {
constchar*name;// 1
struct_class_t *cls;// 2
conststruct_method_list_t *instance_methods;// 3
conststruct_method_list_t *class_methods;// 4
conststruct_protocol_list_t *protocols;// 5
conststruct_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_setAssociatedObject和objc_getAssociatedObject方法绑定,不过这种方法生成的与一个普通的实例变量完全是两码事。
编译器,你对category干了什么?
@interfaceSark:NSObject
- (void)speak;
@end
@interfaceSark(GayExtention)
- (void)burst;
@end
网友评论