Category的实现原理?
编译文件的顺序跟添加在这里的顺序有关系,先添加就会先编译。相同的方法,分类的方法会优先执行。如果两个分类都有这个方法,谁后编译谁先执行
答案:
- Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息
- 在程序运行的时候,runtime会将Category的数据合并到类信息中(类对象、元类对象中)
Category和Extension的区别是什么?
答案:
1、 Class Extension在编译的时候,它的数据就已经包含在类信息中
2、 Category是在运行时,才会将数据合并到类信息中
Category中有load方法吗?load方法是什么时候调用的?load方法能继承吗?
答案:
- 有。
- 在runtime加载类、分类的时候调用。
- load方法可以继承,但是一般情况下不会主动调用load方法,都是让系统自动调用。
load、initialize方法的区别?他们在category中的调用的顺序?以及出现继承时他们之间的调用过程?
区别:
一、调用方式:load是根据函数地址直接调用,initialize是通过objc_msgsend调用
二、调用时刻:load是runtime加载类和分类的时候调用(只会调用一次);initialize是类第一次接收到消息的时候调用,每一个类只会initialize一次(父类的initialize方法会被调用多次)
三、调用顺序
load:
1、先调用类的load方法
- 先编译的类先调用
- 调用子类的load之前,会先调用父类的load;
2、再调用分类的load方法- 先编译,先调用
initialize:
1、先初始化父类
2、再初始化子类(可能最终调用的是父类的initialize方法)
Category能否添加成员变量?如果可以,如何给Category添加成员变量?
答案:不能直接给Category添加成员变量,但是可以间接实现Category有成员变量(runtime关联对象)。分类中写属性,只会生成get、set方法的声明,不会实现和生成一个成员变量。