美文网首页iOS开发 - 底层原理总结
iOS中分类的本质详解(附面试题) - 底层原理总结

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

作者: 非洲小白猿 | 来源:发表于2019-07-15 23:00 被阅读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方法会在程序启动就会调用,当装载类信息的时候就会调用。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/lnifhctx.html