Category 的 本质

2020-04-21  本文已影响0人  化二缺
  1. 属性需要自己实现get /set
  2. 多个Category中的方法协议等 会合并到一个数组中 再添加到对应类
  3. memmove memcpy
  4. 如果 Category 中写一个和对应的类一样的方法 实际上不是覆盖 是抢先了
  5. 上面的两个方法会把 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 调用 所以找到谁调用谁
上一篇 下一篇

猜你喜欢

热点阅读