一、Category 的使用场合
-
主要作用是为已经存在的类添加方法。
-
一个类中的代码非常多,如果超过1000多行,那么在翻阅的时候也会觉得很困难,但是继承下来,再使用的时候,只能集成子类,而且方法比较多,想要直接分散开来,不是特别容易,所以可以采取分类的方式,把想通类型的代码加载在一起。
好处:可以把类的实现分开在几个不同的文件里面。这样做有几个显而易见的好处, a)可以减少单个文件的体积 b)可以把不同的功能组织到不同的category里 c)可以由多个开发者共同完成一个类 d)可以按需加载想要的category 等等。 并且 还可以按照需要加载想要的category。
二、Category实现原理
Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息
在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象、元类对象中)
三、Category与Extension的区别
Class Extension在编译的时候,它的数据就已经包含在类信息中
Category是在运行时,才会将数据合并到类信息中
四、 Category中有load方法吗?load方法是什么时候调用的?load 方法能继承吗?
有load方法
load方法在runtime加载类、分类的时候调用
load方法可以继承,但是一般情况下不会主动去调用load方法,都是让系统自动调用
五、 load、initialize方法的区别什么?它们在category中的调用的顺序?以及出现继承时他们之间的调用过程?
1.调用方式:
- load是根据函数地址直接调用
- initialize 是通过objc_msgSend 调用
2.调用时刻:
1. load是 runtime加载类、分类的时候调用(只会调用一次)
2. initialize是类第一次接收到消息时调用, 每一个类只会initialize一次(父 类的initialize方法可能会被调用多次)
load,intiallize的调用顺序:
1.load
1.先调用类的load,
2. 先编译的类,优选调用load
3.调用子类的load之前,会先调用类的load
2.initialize
1.先初始化父类
2.再初始化子类(父类可能会被多次调用intiallize)
357

被折叠的 条评论
为什么被折叠?



