美文网首页iOS开发技术分享iOS
做题系列之4---今天不做题

做题系列之4---今天不做题

作者: 08878f627e79 | 来源:发表于2016-04-01 13:53 被阅读50次

    今天的主题是:

    • C语言指针的小知识点
    • 怎么证明meta class中保存的是类方法

    一、 什么是指针数组、什么是数组指针、什么二级指针?

    • 指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
    • 数组指针:a pointer to an array,即指向数组的指针

    举个具体栗子:

    • int* a[4] 指针数组 数组a中的元素都为int型指针
    • int (*a)[4] 数组指针 指向数组a的指针

    那二级指针是什么捏。如下:

    char *argv[3]={{"abcdefg"},{"1234567"},{"q1w2e3r"}};  
    char **p = argv;  //二级指针
    
    printf("*p=%s/n",*p);            //*p=abcdefg
    printf("*(p+1)=%s/n",*(p+1));    //*(p+1)=1234567
    printf("*(p+2)=%s/n",*(p+2));    //*(p+2)=q1w2e3r
    

    由上可见,可以简单的把二级指针理解为指针数组。

    二、 怎么证明meta class中保存的是类方法?

    在objc-runtime-new.mm中有_read_images这个方法,我们来看一下(截取关键代码)

    for (EACH_HEADER) {
            category_t **catlist = 
                _getObjc2CategoryList(hi, &count);
            for (i = 0; i < count; i++) {
                category_t *cat = catlist[i];
                Class cls = remapClass(cat->cls);
    
                bool classExists = NO;
                if (cat->instanceMethods ||  cat->protocols  
                    ||  cat->instanceProperties) 
                {
                    addUnattachedCategoryForClass(cat, cls, hi);
                    if (cls->isRealized()) {
                        remethodizeClass(cls);
                        classExists = YES;
                    }
                }
    
                if (cat->classMethods  ||  cat->protocols) 
                {
                    addUnattachedCategoryForClass(cat, cls->ISA(), hi);
                    if (cls->ISA()->isRealized()) {
                        remethodizeClass(cls->ISA());
                    }
                }
            }
        }
    

    这是加载category的代码,我们看到他区分了instanceMethods和classMethods。并且将classMethods加入了cls->ISA(),也就是meta class。

    相关文章

      网友评论

        本文标题:做题系列之4---今天不做题

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