[objective-c]得到所有的本机类的列表

标签: ios Objective-C
发布时间: 2016/10/4 4:45:09
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想要得到所有本机类 (NSString,NSNumber,int,漂浮,一个可编程,NSDictionary),装入我的 iOS 项目。

即,如果已经创建了一个名为"了 testclass 类"的自定义类,我不想它列出...

我已经有一个代码,但它返回加载任何方式我可以修改代码,以将列表限制为仅本机类的所有类的名称吗?

#import <objc/runtime.h>
#import <dlfcn.h>
#import <mach-o/ldsyms.h>


unsigned int count;
const char **classes;
Dl_info info;

dladdr(&_mh_execute_header, &info);
classes = objc_copyClassNamesForImage(info.dli_fname, &count);

for (int i = 0; i < count; i++) {
  NSLog(@"Class name: %s", classes[i]);
  Class class = NSClassFromString ([NSString stringWithCString:classes[i] encoding:NSUTF8StringEncoding]);
  // Do something with class

}

解决方法 1:

你会得到所有加载的类与

int numClasses;
Class * classes = NULL;

classes = NULL;
numClasses = objc_getClassList(NULL, 0);

if (numClasses > 0 )
{
    classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses);
    numClasses = objc_getClassList(classes, numClasses);
    for (int i = 0; i < numClasses; i++) {
        Class c = classes[i];
        NSLog(@"%s", class_getName(c));
    }
    free(classes);
}

(从objc_getClassList文件的代码)。

要限制列表中,您可以检查从其类加载,例如

Class c = classes[i];
NSBundle *b = [NSBundle bundleForClass:c];
if (b != [NSBundle mainBundle])
    ...

未从您的应用程序加载的所有类。

赞助商