category的秘密

2019-11-03  本文已影响0人  凤毛麟角0712

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

上一篇 下一篇

猜你喜欢

热点阅读