2016-11-04 3 views
0

У меня есть тестовое приложение (которое ничего не делает, потому что я использую его для проверки ошибки), который включает в себя 3 фреймворка, которые я создал. Фреймы копируются с использованием фазы файлов копий в каталог Frameworks приложения. У меня есть следующий код приложения делегата:iOS: objc_copyClassNamesForImage не работает на устройстве

#import "AppDelegate.h" 
@import ObjectiveC; 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [[NSBundle allFrameworks] enumerateObjectsUsingBlock:^(NSBundle *framework, NSUInteger idx, BOOL *stop) { 
     unsigned int count = 0; 
     __unused const char** classes = objc_copyClassNamesForImage([[framework executablePath] UTF8String], &count); 
     NSRange inFramework = [framework.executablePath rangeOfString:@".app/Frameworks"]; 
     if (inFramework.length > 0) { 
      NSLog(@"Framework %@, classes: %i", framework.executablePath.lastPathComponent, count); 
     } 
    }]; 
    return YES; 
} 

@end

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

Когда я запускаю этот код на тренажере я получаю следующие результаты:

2016-11-04 12:02:17.682 RuntimeTest[54326:623229] Framework PEGKit, classes: 24 
2016-11-04 12:02:17.705 RuntimeTest[54326:623229] Framework Alchemic, classes: 57 
2016-11-04 12:02:17.707 RuntimeTest[54326:623229] Framework StoryTeller, classes: 10 

Однако, когда я запускаю его на устройстве, я получаю:

2016-11-04 12:07:04.215417 RuntimeTest[1035:365233] Framework PEGKit, classes: 0 
2016-11-04 12:07:04.224495 RuntimeTest[1035:365233] Framework Alchemic, classes: 0 
2016-11-04 12:07:04.254946 RuntimeTest[1035:365233] Framework StoryTeller, classes: 0 

устройство представляет собой iPhone 7 с iOS 10.1. Я уверен, что этот код работал в прошлом, и кажется, что objc_copyClassNamesForImage как-то сломан.

Моя рабочая теория заключается в том, что это может быть ошибка 10.1. Или, возможно, что-то, что установлено/не установлено в свойствах сборки.

У каждого, кто может это подтвердить? или иметь представление о том, что может быть неправильным?

ответ

0

На устройстве вы должны префикс пути к изображению рамки с помощью /private. Если вы попросите пакет для своего пути, вы увидите, что он имеет префикс /private. Вот как я нашел обходной путь.