美文网首页Object-c
Category实现的原理二:分类信息如何添加到本类中

Category实现的原理二:分类信息如何添加到本类中

作者: 小心韩国人 | 来源:发表于2019-11-23 16:50 被阅读0次

    Category实现的原理一:底层结构及源码分析中我们知道了category的底层数据结构,以及从runtime源码层面了解了category的本质.这篇文章我们研究一下runtime是如何把分类中的信息附加到本类中.

    我们在上一篇文章中了解到,runtime是通过methods.attachLists(mlists, mcount)方法把分类的方法列表附加到本类中,但是不知道它内部具体是如何实现的,我们按 FFFFFFFF 进入这个方法:

    attachLists 方法内部
    • 1: 根据传递进来方法列表数组和数量,重新扩容本类中存储方法列表的数组array()
    • 2: 通过memmove(void *__dst, const void *__src, size_t __len)方法移动本类中老的方法列表的位置
    • 3: 通过memcpy(void *__dst, const void *__src, size_t __n)把分类中新增的方法列表拷贝到本类的array()中.

    我们先了解一下memmovememcpy两个方法具体是怎么工作的.
    memmove(void *__dst, const void *__src, size_t __len):由src所指内存区域复制count个字节到dest所指内存区域。
    memcpy(void *__dst, const void *__src, size_t __n):从源source所指的内存地址的起始位置开始拷贝n个字节到目标destin所指的内存地址的起始位置中。

    其实mommove , memcpy都是复制指定位置的 n 个长度的内容到目标位置的.他们的区别在于当srcdst内存区域重合时的处理方法上略微不同.

    • memcpy复制的时候不考虑有无内存重叠区域,就是从头到尾一个一个按顺序复制到dst所指内存区域,所以如果出现内存区域重叠情况下,复制后的数据可能会损坏,并不是正确的数据,它的源码如下:
    void  *memcpy(void *dest, const void *src, size_t count)
    {
    assert(dest != NULL || src != NULL);
    
    char *tmp = (char *)dest;
    char *p = (char *)src;
    
    while (count--)
    {
    *tmp++ = *p++;
    }
    return dest;
    }
    

    拷贝流程图:


    memcpy 流程
    • memmove源码如下:
    void *memmove(void *dest, const void *src, size_t count)
    {
    assert(dest != NULL || src != NULL)
    
    if (dst < src)
    {
    char *p = (char *)dest;
    char *q = (char *)src;
    while (count--)
    {
    *p++ = *q++;
    }
    }
    else
    {
    char *p = (char *)dest + count;
    char *q = (char *)src + count;
    while (count--)
    {
    *--p = *--q;
    }
    }
    
    return dest;
    }
    

    从源码中可以看到,memmove多了一种else情况,当dstsrc内存区域重叠时分两种情况:
    1: dstsrc左边,如图:

    dst在src左边

    2: dstsrc右边,如图:

    dst在src右边

    可以清晰的看到,当dstsrc左边时候,memmovememcpy一样,都是从前往后一个个复制;但是当dstsrc右边时候,复制的顺序就颠倒过来了,变成了从后往前复制,这样就能保证复制数据的正确性.


    ok,了解了memmovememcpy这两个方法的工作原理之后,我们在回到runtime源码,看看runtime内部是如何把category分类信息附加到本类中的.

    attachLists 内部实现
    图解说明:
    attachLists 图解

    这就是rutime把分类信息整合到本类的流程,通过最后的结果,可以看出来,分类的信息最后是添加到本类信息的前面的.所以如果分类中有和本类相同的方法,会优先调用分类的方法实现.

    相关文章

      网友评论

        本文标题:Category实现的原理二:分类信息如何添加到本类中

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