Category的使用场合是什么 ?
一个类需要拆分为不同模块的时候使用
Category的实现原理
Category编译后的底层结构是struct category_t;里面存储着分类的对象方法,类方法,属性协议信息,在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象,元类对象)
Category和Class Extension的区别
Class Extension在编译的时候他的数据就已经包含到类信息中
Category是在运行时才会将数据合并到类信息中
Category中有load方法吗?有的话什么时候调用?load方法能继承么?
有load方法。
load方法在runtime加载类,分类的时候调用
load方法可以继承,但是一般情况下不会主动去调用load方法,都是让系统自动调用
为什么类中的load方法与Category中的load方法都会调用 ?
因为load方法是通过函数指针指向的函数进行的直接调用
load initialize方法的区别是什么?他们在category中的调用的顺序?以及出现继承时他们之间的调用过程?
1.调用方式的区别:
load是根据函数地址直接调用
initialize是通过objc_msgSend调用
2.调用时刻:
1.> load是runtime加载类,分类的时候调用(只会调用1次)
2.> initialize是类第一次接收到消息的时候调用,每一个类只会initialize一次(父类的initialize方法可能会调用多次)
3.调用顺序 :
1.>load
先调用类的load
先编译的类优先调用
调用子类的load之前,优先调用父类的load
2.> 再调用分类的load
先编译的分类,优先调用load
2.initialize
先初始化父类
再初始化子类(可能最终调用的是父类的initialize方法)
Category能否添加成员变量?如果可以如何给Category添加成员变量?
memmove:会根据内存大小判定向右还是向左挪动,且能保证原有的数据完整的挪动
memcpy:一个一个格子的copy