开胃面试题
1.了解过Category的实现原理吗?Category为什么只能增加方法不能增加属性?
2.Category中有load方法吗?load方法是什么时候调用的?load方法能继承吗?
3.load、initialize的区别是什么,调用的顺序是怎样的?
看这篇文章之前可以先回答一下这几个面试题,然后带着问题耐心看完这篇文章,再来回答一下看看
一、分类的底层结构
分类的源码
struct category_t {
const char *name;
classref_t cls;
struct method_list_t *instanceMethods; // 对象方法
struct method_list_t *classMethods; // 类方法
struct protocol_list_t *protocols; // 协议
struct property_list_t *instanceProperties; // 属性
// Fields below this point are not always present on disk.
struct property_list_t *_classProperties;
method_list_t *methodsForMeta(bool isMeta) {
if (isMeta) return classMethods;
else return instanceMethods;
}
property_list_t *propertiesForMeta(bool isMeta, struct header_info *hi);
};
从分类的源码中,可以看出我们平时使用分类的方式,对象方法、类方法、协议、属性都可以找到对应的存储方式。但是找来找去,却找不到成员变量,所以分类中是不允许添加成员变量的。往分类中添加的属性不会自动生成成员变量,只会生成set、get方法的声明,需要我们自己去实现。
二、load与initialize
load方法会在程序启动就会调用,当装载类信息的时候就会调用。