美文网首页
Category 的 本质

Category 的 本质

作者: 化二缺 | 来源:发表于2020-04-21 11:20 被阅读0次
  • Category的实现原理,以及Category为什么只能添加方法不能添加属性 ?
    category的底层结构是struct category_t 里面包含了基本的 类方法、实例方法、协议信息、成员变量、当程序运行的时候,利用运行时机制将类方法、实力方法、协议信息等合并到原来的类中。


    Category的底层.png
  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 调用 所以找到谁调用谁

相关文章

网友评论

      本文标题:Category 的 本质

      本文链接:https://www.haomeiwen.com/subject/ltpyihtx.html