获取工程中所有的类(利用runtime函数)

获取工程中所有的类

主要利用到2个相关的runtime函数

1
2
3
1.int objc_getClassList(Class *buffer, int bufferCount)
2.Class *objc_copyClassList(unsigned int *outCount)

函数1的使用

int objc_getClassList(Class *buffer, int bufferCount)
此函数的作用是获取已经注册的类,需要传入2个参数:

1
2
3
参数1:buffer:已分配好内存空间的数组
参数2:bufferCount:数组中可存放元素的个数,返回值是注册的类的总数

代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int numClasses = 0, newNumClasses = objc_getClassList(NULL, 0); // 1
Class *classes = NULL; // 2
while (numClasses < newNumClasses) { // 3
numClasses = newNumClasses; // 4
classes = (Class *)realloc(classes, sizeof(Class) * numClasses); // 5
newNumClasses = objc_getClassList(classes, numClasses); // 6
for (int i = 0; i < numClasses; i++) { // 7
const char *className = class_getName(classes[i]); // 8
NSLog(@"%s", className); // 9
} // 10
} // 11
free(classes); // 12
第1行代码中的`objc_getClassList`函数是为了获取 到当前注册的所有类的总个数`newNumClasses`
第5行代码是根据`newNumClasses`调整数组`class`的空间
第6行代码是将元素存放入`class`数组中
<!-- ``` -->

1
2
3
4
利用这个函数还可以获取到某一个类的所有子类,在上述代码的第9行和第10行中间添加如下代码:
if (class_getSuperclass(classes[i]) == [UIScrollView class]) {
NSLog(@"subclass of UIScrollView : %s", className);
}

函数2的使用

Class *objc_copyClassList(unsigned int *outCount)
此函数的作用是获取所有已注册的类,效果和函数1的参数传入NULL0的时候效果一样

1
2
3
4
5
6
unsigned int outCount;
Class *classes = objc_copyClassList(&outCount);
for (int i = 0; i < outCount; i++) {
NSLog(@"%s", class_getName(classes[i]));
}
free(classes);