Как я могу получить список классов, уже загруженных в память в определенном пакете (или двоичном файле)? - PullRequest
7 голосов
/ 31 июля 2011

Можно получить список классов из пакета через NSBundleDidLoadNotification. Но я не могу понять, как я могу получить их из уже загруженного пакета. (тот же пакет с кодом)

Я пытаюсь получить список классов моего пакета приложений. Точнее, классы только в двоичном приложении.

Я посмотрел на objc_getClassList, но он возвращает ALL классов, и он, очевидно, слишком тяжел для меня. Мне нужен легкий метод. Я нашел objc_copyClassNamesForImage, прибегая к помощи Google, но это не задокументировано, и я не знаю, как его безопасно использовать . Я думаю, что могу попытаться использовать его условно, но я хочу найти другой более безопасный вариант, прежде чем идти туда.

Ответы [ 3 ]

4 голосов
/ 31 июля 2011

Другой вариант - перебрать все классы, зарегистрированные в среде выполнения, и использовать +[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

Тогда вы можете позвонить:

NSLog(@"%@", [[NSBundle mainBundle] definedClasses_dd]);
4 голосов
/ 01 мая 2014

Попробуйте эту магию:

-(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;
}
1 голос
/ 31 июля 2011

Я могу найти здесь пример функции objc_copyClassNamesForImage.

http://www.opensource.apple.com/source/objc4/objc4-493.9/test/weak.m

// class name list
const char *image = class_getImageName(objc_getClass("NotMissingRoot"));
testassert(image);
const char **names = objc_copyClassNamesForImage(image, NULL);
testassert(names);
testassert(classInNameList(names, "NotMissingRoot"));
testassert(classInNameList(names, "NotMissingSuper"));
if (weakMissing) {
    testassert(! classInNameList(names, "MissingRoot"));
    testassert(! classInNameList(names, "MissingSuper"));
} else {
    testassert(classInNameList(names, "MissingRoot"));
    testassert(classInNameList(names, "MissingSuper"));
}
free(names);

Исходный код неофициальный, но от Apple.Поэтому я решил использовать этот код, пока не найду лучшего способа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...