今天的主题是:
- 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。
网友评论