~ Category的实现原理?
Category编译之后的底层结构是struct category_t (struct结构体),里面存储着分类的对象方法、类方法、属性、协议信息,在程序运行的时候,runtime会将Category的数据,合并到类信息中。(类对象、元类对象中)
~ Category和Class Extension的区别是什么?(Extension扩展)
Class Extension在编译的时候,它的数据就已经包含在类信息中。
Category是在运行时,才会将数据合并到类信息中。
(Extension可以添加方法和属性。类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现。
。Category只能添加方法。但是OC语言有动态性,在runtime。只要我们手动在运行时的时候,间接实现Category有成员变量的效果)
~ Category中有load方法吗?load方法是什么时候调用的?load 方法能继承吗?
有load方法。
load方法在runtime加载类、分类的时候调用。
load方法可以继承,但是一般情况下不会主动去调用load方法,都是让系统自动调用。
~ +load方法
+load方法会在runtime加载类、分类时调用。
每个类、分类的+load,在程序运行过程中只调用一次。
~ +initialize方法
+initialize方法会在类第一次接收消息时调用。
先初始化父类,再初始化子类,每个类只初始化一次。
~ +initialize方法和+load方法的区别?
+initialize方法是通过objc_msgSend进行调用。
如果子类没有实现+initialize方法,就会调用父类的+initialize方法(所以父类会调用多次)
~ 怎么实现Category的成员变量?
因为分类底层结构限制,不能添加成员变量到分类中。但可以通过关联对象来间接实现。
关联对象提供的API
添加关联对象
void objc_setAssociatedObject(id object, const voidkey, id value, objc_AssociationPolicy policy)
获得关联对象
id objc_getAssociatedObject(id object, const voidkey)
移除所有关联对象
void objc_removeAssociatedObjects(id object)








网友评论