-
Category的实现原理,以及Category为什么只能添加方法不能添加属性 ?
category的底层结构是struct category_t 里面包含了基本的 类方法、实例方法、协议信息、成员变量、当程序运行的时候,利用运行时机制将类方法、实力方法、协议信息等合并到原来的类中。
Category的底层.png
- 属性需要自己实现get /set
- 多个Category中的方法协议等 会合并到一个数组中 再添加到对应类
- memmove memcpy
- 如果 Category 中写一个和对应的类一样的方法 实际上不是覆盖 是抢先了
- 上面的两个方法会把 Category中的方法放到类的方法数组的前面 所以是先 找到 Category中的方法
#import "Person+morefun.h"
@implementation Person (morefun)
//Category is implementing a method which will also be implemented by its primary class
-(void)run2{
//如果主要类里面写了这个方法 会有以上警告
//如果相同会放到一起 haha, eat, run, run, speak, 不知道为什么
//如果不一样 就是按顺序 run2, haha, eat, run, speak,
}
@end
+load 方法
- 这个方法是在程序启动的时候就要加载 所以这个会影响app启动速度
- 之前某个公司的程序猿特别喜欢写+load方法,app启动超级慢,客户常常骂娘,也是无语。
- objc-os 有个 call_load_methods();
- call_load_methods 里面先 call_class_loads() 然后再 call_category_loads();
- 类里面的load 和分类里面的load都会执行
- 底层是用SEL_load 调用的 所以分类和类里面的load 都会执行 分类的在前
+(void)initialize
- 当类第一次接受到消息时候回调用 一次
- 现在都不用这个方法了
- 会先调用父类的再调用子类的
- 如果之前已经调用过initialize,就不会再进行初始化
- 如果分类中有initialize 就只会调用分类的initialize
- 底层是通过 objc_msgSend 调用 所以找到谁调用谁
网友评论