首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么CFBundleGetDataPointerForName不适用于iOS 8风格的框架?

为什么CFBundleGetDataPointerForName不适用于iOS 8风格的框架?
EN

Stack Overflow用户
提问于 2015-03-20 00:35:41
回答 1查看 244关注 0票数 0

通常在iOS中,您可以使用CFBundleGetDataPointerForName。但是,我发现CFBundleGetDataPointerForName总是返回NULL指针,指向在iOS-8风格框架中定义的常量,就像WWDC 2014会议416:建立现代框架中讨论的那样。

为了进行复制,我只是使用Xcode框架模板创建一个框架,添加一个构建脚本来生成一个通用二进制文件,并将创建的框架拖到另一个具有框架项目的项目中。然后,我尝试从其中加载一个常量,如下所示:

代码语言:javascript
复制
void * versionNumberConstant = CFBundleGetDataPointerForName(CFBundleGetMainBundle(), CFSTR("TestFramework2VersionNumber"));
NSLog(@"Version number was %@",versionNumberConstant ? @"PRESENT" : @"NULL"); // Prints NULL

出于复制目的,这个回购有框架项目,这个回购尝试使用CFBundleGetDataPointerForName从该框架加载常量。我也可以将这个问题复制到其他开发人员已经开发的框架中,比如AdMob的SDK

为了防止指针不在CFBundleGetMainBundle()中出现问题,我还遍历了每个CFBundleRef,无法从其中任何一个加载常量:

代码语言:javascript
复制
CFArrayRef array = CFBundleGetAllBundles();
for (int i = 0; i < CFArrayGetCount(array); i++) {
    CFBundleRef bundleRef = (CFBundleRef)CFArrayGetValueAtIndex(array, i);
    void * versionPointer = CFBundleGetDataPointerForName(bundleRef, CFSTR("TestFramework2VersionNumber"));
    NSLog(@"Version pointer is %@",versionPointer ? @"PRESENT" : @"NULL");
}

有人知道为什么会这样吗?或者,如果有一些构建设置,我可以更改以修复它?

版本信息:

  • Xcode: 6.2 6C131e版
  • iOS: 8.2 (12D508)
  • 设备: iPhone 6/ iPhone 6模拟器
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-21 00:31:19

好的,问题是我需要加载该框架使用的特定包,如下所示:

代码语言:javascript
复制
NSURL *testFramework2URL = [[[[NSBundle mainBundle] resourceURL] URLByAppendingPathComponent:@"Frameworks" isDirectory:YES] URLByAppendingPathComponent:@"TestFramework2.framework"];

CFBundleRef bundleRef = CFBundleCreate(NULL, (__bridge CFURLRef)testFramework2URL);
NSLog(@"Bundle Ref = %@",bundleRef);

double * manualVersion = CFBundleGetDataPointerForName(bundleRef, CFSTR("TestFramework2VersionNumber"));
NSLog(@"Manual version = %@",manualVersion ? @"present" : @"NULL"); // Manual version = present

double version = *manualVersion;
NSLog(@"Version = %g",version); // Version = 1

我也可以使用CFBundleGetAllBundles()实现这一点,尽管我在问题中已经说过了(我在最初使用CFBundleGetAllBundles()函数时肯定犯了错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29157468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档