分类常见面试题
1、分类可以添加属性吗?
答:分类可以添加属性,但是不会自动生成成员变量与get/set方法。但是我们可以通过objc_getAssociatedObject\objc_setAssociatedObject的方式来为UIButton这样的类添加属性。
2、假设A类有一个a方法,现在我们又添加一个A1分类,同样也实现了一个a方法。此时在A类中调用a方法。谁会被调用?为什么?
答:分类中的a方法会被优先调用。
原因:在oc语言中,我们的基类NSObject实际是一个Class,该Class是一个objc_class的struct,在这个结构体中维护了我们类中所有的信息,比如methodLists、ivars、protocols,分别对应的是我们所写的方法列表、成员变量列表、协议列表。
而分类Category实际上同样也是一个struct,信息存储在category_t结构体中,该结构体同样维护了对象方法列表、类方法列表、协议列表、属性列表。多个分类则保存在category_list中。
通过阅读源码,实际上我们可以发现,在runtime的初始化函数中,首先检测是否包含分类并进行遍历。在这个过程中会先将多个分类的对象方法列表,类方法列表,协议列表存放到对应的数组中。
最后取出原有类中的方法列表与分类的方法列表进行合并操作,我们也可以理解成插入操作。分类中的方法会插入到原有类方法的前面。当然在内存中实际上是进行了内存移动和内存拷贝。这就是为什么分类中的方法会被优先调用的原因。在内存中原有类的方法仍然存在。