Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何获取已在特定包(或二进制)中加载到内存中的类列表?_Objective C_Ios_Cocoa Touch_Cocoa - Fatal编程技术网

Objective c 如何获取已在特定包(或二进制)中加载到内存中的类列表?

Objective c 如何获取已在特定包(或二进制)中加载到内存中的类列表?,objective-c,ios,cocoa-touch,cocoa,Objective C,Ios,Cocoa Touch,Cocoa,可以通过nsbundleddloadnotification从包中获取类列表。但我不知道如何从已经加载的包中获取它们。(与代码相同的捆绑包) 我正在尝试获取我的应用程序包的类列表。更具体地说,这些类只存在于我的应用程序二进制文件中 我查看了objc_getClassList,但它返回所有类,显然对我来说太重了。我需要轻量级的方法。我通过谷歌搜索找到了objc_copyClassNamesForImage,但它没有文档记录,我不知道如何安全地使用它。我想我可以尝试按常规使用它,但我想在去那里之前找

可以通过
nsbundleddloadnotification
从包中获取类列表。但我不知道如何从已经加载的包中获取它们。(与代码相同的捆绑包)

我正在尝试获取我的应用程序包的类列表。更具体地说,这些类只存在于我的应用程序二进制文件中


我查看了
objc_getClassList
,但它返回所有类,显然对我来说太重了。我需要轻量级的方法。我通过谷歌搜索找到了objc_copyClassNamesForImage,但它没有文档记录,我不知道如何安全地使用它。我想我可以尝试按常规使用它,但我想在去那里之前找到另一个更安全的选项。

我可以在这里找到一些函数
objc_copyClassNamesForImage
的示例


源代码是非官方的,但来自苹果。所以我决定使用这段代码,直到找到更好的方法。

另一个选择是迭代所有注册到运行时的类,并在每个类上使用
+[NSBundle bundleForClass:
,以确定它来自哪个类。然后,您可以根据结果将事物分类到集合中

大概是这样的:

@interface NSBundle (DDAdditions)

- (NSArray *)definedClasses_dd;

@end

@implementation NSBundle (DDAdditions)

- (NSArray *)definedClasses_dd {
    NSMutableArray *array = [NSMutableArray array];

    int numberOfClasses = objc_getClassList(NULL, 0);
    Class *classes = calloc(sizeof(Class), numberOfClasses);
    numberOfClasses = objc_getClassList(classes, numberOfClasses);
    for (int i = 0; i < numberOfClasses; ++i) {
        Class c = classes[i];
        if ([NSBundle bundleForClass:c] == self) {
            [array addObject:c];
        }
    }
    free(classes);
    return array;
}

@end
试试这个魔术:

-(NSArray*)getClassNames{
    NSMutableArray* classNames = [NSMutableArray array];
    unsigned int count = 0;
    const char** classes = objc_copyClassNamesForImage([[[NSBundle mainBundle] executablePath] UTF8String], &count);
    for(unsigned int i=0;i<count;i++){
        NSString* className = [NSString stringWithUTF8String:classes[i]];
        [classNames addObject:className];
    }
    return classNames;
}
-(NSArray*)getClassNames{
NSMutableArray*类名=[NSMutableArray];
无符号整数计数=0;
const char**classes=objc_copyClassNamesForImage([[NSBundle mainBundle]executablePath]UTF8String],&count);

对于(unsigned int i=0;我可以再定义一点问题空间吗?您是想获取应用程序本身或其他东西已经加载的捆绑包中的类列表吗?@Chris我想获取应用程序二进制文件本身定义的类列表。我修改了我的问题。谢谢:)你看过以下文档了吗?@Chris很遗憾,它看起来不是我所需要的功能。很有趣。我认为“搜索相关捆绑包”谈到调用AlpBeLes返回一个数组的所有应用程序的非框架捆绑应该做…它看起来所有的类当前加载在系统中。我应该考虑使用时的性能吗?@ EnIL当然可以考虑性能。因为这是针对IOS,你不会加载其他捆绑,所以你可以。修改此代码,为它找到的每个bundle构建数组,然后将这些数组作为静态信息缓存。然后
definedClasses
方法只需访问该缓存(或在必要时创建).你没有抓住要点,他说他想以一种非繁重的方式实现它;他特别指的是您首先使用的繁重的objc_getClassList方法,然后使用filter。顺便说一下,它会返回6000个类。
NSLog(@"%@", [[NSBundle mainBundle] definedClasses_dd]);
-(NSArray*)getClassNames{
    NSMutableArray* classNames = [NSMutableArray array];
    unsigned int count = 0;
    const char** classes = objc_copyClassNamesForImage([[[NSBundle mainBundle] executablePath] UTF8String], &count);
    for(unsigned int i=0;i<count;i++){
        NSString* className = [NSString stringWithUTF8String:classes[i]];
        [classNames addObject:className];
    }
    return classNames;
}