美文网首页
OC 中的 category

OC 中的 category

作者: LeeDev | 来源:发表于2018-09-17 11:27 被阅读8次

在谈category的时候,就需要对比的看下扩展。

扩展:编译的时候决定,一般来说 是声明 私有的属性和变量
类别:主要是 在运行时决定 。同时 可以添加类/实例方法协议属性

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);
};

查看代码:
objc-runtime-new.mm 中找到入口 函数 Class realizeClass(Class cls), 在最后有个 methodizeClass(cls) 就是加入类别的方法.内部有

    // Install methods and properties that the class implements itself.
    method_list_t *list = ro->baseMethods();
    if (list) {
        prepareMethodLists(cls, &list, 1, YES, isBundleClass(cls));
        rw->methods.attachLists(&list, 1);
    }

然后我们 查看 methods.attachLists 方法
void attachLists(List* const * addedLists, uint32_t addedCount) {
        if (addedCount == 0) return;

        if (hasArray()) {
            //
            // many lists -> many lists
            uint32_t oldCount = array()->count;
            uint32_t newCount = oldCount + addedCount;
            //1.重新分配,相当于 用空间换时间
            setArray((array_t *)realloc(array(), array_t::byteSize(newCount)));
            array()->count = newCount;
            //内存移动 memmove(void *__dst, const void *__src, size_t __len)
            //2.【OldList1,OldList2,OldList3】 往后移动 addedCount 位置
            // array()->lists + 1 : 是相当于 偏移 sizeOf(array()->lists[0])的位置
            memmove(array()->lists + addedCount, array()->lists, 
                    oldCount * sizeof(array()->lists[0]));
            //memcpy(void *__dst, const void *__src, size_t __n)
            //3.相当于 把 新的数组【CateList1,CateList2】放入到 array()->lists 的起始位置
            memcpy(array()->lists, addedLists, 
                   addedCount * sizeof(array()->lists[0]));
        }
。。。。
}

相关文章

  • 结合 category 工作原理分析 OC2.0 中的 runt

    结合 category 工作原理分析 OC2.0 中的 runtime 结合 category 工作原理分析 OC...

  • 分类、类扩展与继承

    在OC中,扩展一个类的方式有两种,继承和分类。 分类(Category) 概念 分类(Category),是OC中...

  • OC 中的 category

    在谈category的时候,就需要对比的看下扩展。 扩展:编译的时候决定,一般来说 是声明 私有的属性和变量类别:...

  • OC中的Category

    注意:所有的分类方法都会被合并到class对象和meta-class对象中,不会覆盖掉原对象的方法。可以通过run...

  • OC中的Category(三)

    OC中的Category(三) OC中+initialize函数加载和调用 OC对象是在查找方法时判断自己有没有初...

  • swift中Extension的简单理解

    swift中的extension和OC中的Category有点类似,同时也比category的功能更加的强大,想e...

  • iOS面试技术点总结

    1.category和extension。 (分类(Category)是OC中的特有语法,它是表示一个指向分类的结...

  • OC中Category分析

    分类的底层结构 实现原理 将方法、属性、协议数据保存在category_t的结构体中,然后将结构体中的方法列表拷贝...

  • OC--Category、AssociatedObject

    Category原理、作用深入理解Objective-C:Category (OC1.0)结合 category ...

  • iOS 分类(category)和扩展(extension)

    分类(Category): 概念 分类(Category)是OC中的特有语法,它是表示一个指向分类的结构体的指针。...

网友评论

      本文标题:OC 中的 category

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