2016-11-04 123 views
0

我有一个测试应用程序(它什么都不做,因为我用它来测试一个bug),其中包括我构建的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前缀。这就是我找到解决方法的方法。