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

今天的主题是:

  • 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---今天不做题)