为什么';CbundleGetDataPointerForname是否适用于iOS 8风格的框架?
通常在iOS中你可以。但是,我发现为什么';CbundleGetDataPointerForname是否适用于iOS 8风格的框架?,ios,objective-c,frameworks,Ios,Objective C,Frameworks,通常在iOS中你可以。但是,我发现CbundlegetDataPointerForName总是为iOS-8风格框架中定义的常量返回NULL指针,如中所述 为了复制,我只是用Xcode框架模板创建了一个框架,添加了一个构建脚本来生成一个通用二进制文件,然后将创建的框架拖到另一个项目中,就得到了框架项目。然后我尝试从中加载一个常量,如下所示: void * versionNumberConstant = CFBundleGetDataPointerForName(CFBundleGetMainBun
CbundlegetDataPointerForName
总是为iOS-8风格框架中定义的常量返回NULL
指针,如中所述
为了复制,我只是用Xcode框架模板创建了一个框架,添加了一个构建脚本来生成一个通用二进制文件,然后将创建的框架拖到另一个项目中,就得到了框架项目。然后我尝试从中加载一个常量,如下所示:
void * versionNumberConstant = CFBundleGetDataPointerForName(CFBundleGetMainBundle(), CFSTR("TestFramework2VersionNumber"));
NSLog(@"Version number was %@",versionNumberConstant ? @"PRESENT" : @"NULL"); // Prints NULL
出于复制目的,具有框架项目,并尝试使用CFBundleGetDataPointerForName
从该框架加载常量。
我还可以将这个问题复制到其他开发人员开发的框架中,例如
为了防止指针不在CbundleGetMainBundle()
中出现问题,我还循环了每个CbundleRef
,无法从其中任何一个加载常量:
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");
}
CFArrayRef数组=CFBundleGetAllBundles();
对于(int i=0;i
是否有人知道这是为什么,或者是否有一些构建设置我可以更改以修复它
版本信息:
- Xcode:6.2版6C131e
- iOS:8.2(12D508)
- 设备:iPhone 6/iPhone 6模拟器
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()
函数或其他东西时一定犯了错误)