分类

作者: 小行为 | 来源:发表于2018-11-14 16:48 被阅读12次

分类作用:

声明私有方法
分解体积庞大的类文件
把framework的私有方法公开化

分类特点

-运行时决议
-可以为系统类添加分类 (UIView 坐标等)

分类中可以添加哪些内容:

可以添加实例方法
可以添加类方法
添加协议
添加 属性(只声明对应 set get方法, 不是添加实例变量 如果添加实例变量需要用到 关联对象)

分类加载调用栈

-objc-init ->  // images(镜像) 不是图片
map_2_imags ->
 map_image_nolock -> 
_read_images ->  
remethodizeClass  
屏幕快照 2018-11-14 下午2.37.59.png

分类总结:

1、同名分类方法是倒序添加进分类方法列表所以 最后编译的分类才生效
2、分类添加的方法可以 “覆盖” 原类方法 (原类方法保留)
3、名字相同的分类会引起编译报错

分类源码

// Attach method lists and properties and protocols from categories to a class.
// Assumes the categories in cats are all loaded and sorted by load order, 
// oldest categories first.
static void 
attachCategories(Class cls, category_list *cats, bool flush_caches)
{
    if (!cats) return;
    if (PrintReplacedMethods) printReplacements(cls, cats);

    bool isMeta = cls->isMetaClass();

    // fixme rearrange to remove these intermediate allocations
    method_list_t **mlists = (method_list_t **)
        malloc(cats->count * sizeof(*mlists));
    property_list_t **proplists = (property_list_t **)
        malloc(cats->count * sizeof(*proplists));
    protocol_list_t **protolists = (protocol_list_t **)
        malloc(cats->count * sizeof(*protolists));

    // Count backwards through cats to get newest categories first
    int mcount = 0;
    int propcount = 0;
    int protocount = 0;
    int i = cats->count;
    bool fromBundle = NO;
    while (i--) {
        auto& entry = cats->list[i];

        method_list_t *mlist = entry.cat->methodsForMeta(isMeta);
        if (mlist) {
            mlists[mcount++] = mlist;
            fromBundle |= entry.hi->isBundle();
        }

        property_list_t *proplist = entry.cat->propertiesForMeta(isMeta);
        if (proplist) {
            proplists[propcount++] = proplist;
        }

        protocol_list_t *protolist = entry.cat->protocols;
        if (protolist) {
            protolists[protocount++] = protolist;
        }
    }

    auto rw = cls->data();

    prepareMethodLists(cls, mlists, mcount, NO, fromBundle);
    rw->methods.attachLists(mlists, mcount);
    free(mlists);
    if (flush_caches  &&  mcount > 0) flushCaches(cls);

    rw->properties.attachLists(proplists, propcount);
    free(proplists);

    rw->protocols.attachLists(protolists, protocount);
    free(protolists);
}


    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;
            setArray((array_t *)realloc(array(), array_t::byteSize(newCount)));
            array()->count = newCount;
            memmove(array()->lists + addedCount, array()->lists, 
                    oldCount * sizeof(array()->lists[0]));

        /*
        内存拷贝 
        */
            memcpy(array()->lists, addedLists, 
                   addedCount * sizeof(array()->lists[0]));
        }
        else if (!list  &&  addedCount == 1) {
            // 0 lists -> 1 list
            list = addedLists[0];
        } 
        else {
            // 1 list -> many lists
            List* oldList = list;
            uint32_t oldCount = oldList ? 1 : 0;
            uint32_t newCount = oldCount + addedCount;
            setArray((array_t *)malloc(array_t::byteSize(newCount)));
            array()->count = newCount;
            if (oldList) array()->lists[addedCount] = oldList;
            memcpy(array()->lists, addedLists, 
                   addedCount * sizeof(array()->lists[0]));
        }
    }

相关文章

  • 一次性产品

    包装材质分类 牙具分类 牙膏分类 梳子分类 拖鞋材质

  • 一明音频6按次序表答

    分类演讲,有条理,按男女分类,年龄分类,籍贯分类,其它。职业分类,戴眼镜,头发分类,例如对深圳的认识?一,天气,二...

  • 客户分类

    酒店布草租赁项目:市场细分是动脑干活的基础!数量分类、地域分类、男女分类、品牌分类、出租率分类、价格分类等等!举例...

  • 分类页面通用变量

    $sortid分类id $sortName分类名称 $template分类模版 $lognum该分类文章数 $so...

  • Excel学习笔记5

    知识点 1.分类汇总工具 -必须先排序再分类汇总 分类字段 -分类汇总-全部删除 可以撤销掉之前的分类汇总 -分类...

  • 生活垃圾分类

    1、什么是垃圾分类 生活垃圾分类通俗得说就是在源头将生活垃圾进行分类投放,并通过分类收集、分类运输和分类处理,力争...

  • 机器学习之分类器

    0、分类器热身,NextStep比较懒,直接看图 分类分类,先分解再分类,比如,疾病分类模型先将病情的表现信息进行...

  • 商品管理案例——案例准备

    一、案例的概述 1、案例实现的功能 分类管理  查询分类  添加分类  删除分类  修改分类 商品管理  查询商品...

  • 分类(Category)与类拓展(Extension)

    分类(Category) 1.分类(Category)是什么? 分类是oc特有的语法,表示指向分类的结构体指针。分...

  • Emlog531获取指定分类的子分类信息

    //获得指定分类的子分类,参数为分类ID function getsubcategoryinfo($categor...

网友评论

      本文标题:分类

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