iOS开发 - 底层原理总结

iOS中分类的本质详解(附面试题) - 底层原理总结

2019-07-15  本文已影响0人  非洲小白猿

开胃面试题

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方法会在程序启动就会调用,当装载类信息的时候就会调用。

上一篇下一篇

猜你喜欢

热点阅读