WWDC 2013课程幻灯片包含一个部分,在某些情况下可以省略显式桥接转换。这是我用Xcode5编写的(使用的是10.8,而不是10.9),编译器抱怨我需要一个桥接类型转换。我是不是完全不理解这个概念?
#import <Foundation/Foundation.h>
CF_IMPLICIT_BRIDGING_ENABLED
CFStringRef MyCreateStringFromNothing();
CF_IMPLICIT_BRIDGING_DISABLED
void SomeFunction() {
// compiler requires bridging cast here...
NSString* x = MyCreateStringFromNothing();
}我问这个问题的原因是我想写:
NSString* s = CFUUIDCreateString(NULL, uuid);我认为关于隐式桥接的新工作应该能让我简单地写出这篇文章。但这也需要一个桥接演员。
发布于 2014-01-06 10:13:32
这似乎是一种黑魔法,但从我的实验来看,其中的"Create“函数不能与隐式桥接一起工作。
当我编译这段代码时:
CF_IMPLICIT_BRIDGING_ENABLED
CFStringRef MyCreateStringFromNothing();
CFStringRef MyGetStringFromNothing();
CF_IMPLICIT_BRIDGING_DISABLED
void SomeFunction() {
NSString *const fails1 = MyCreateStringFromNothing();
NSString *const fails2 = CFStringCreateCopy(kCFAllocatorDefault, CFSTR("FOO"));
NSString *const works = MyGetStringFromNothing();
}前两个方法失败了,但第三个方法“有效”。
请注意,隐式桥接显然仍然无法阻止编译器警告您将CFStringRef转换为NSString *,它只是停止要求您插入__bridge。
您将注意到,在session 404的session 404中的幻灯片中,他使用了CFDictionaryGetValue(),该函数返回一个“WWDC2013 *",因此它是少数几个不会发出警告的函数之一。任何返回实际类型(例如CFStringRef或CFDictionary)的CF函数仍然会抛出警告,所以,请注意。
发布于 2014-01-06 10:09:25
检查项目和/或目标上的编译器设置。如果这是一个较旧的项目,您可能会有一个杂乱的选项,导致您使用较旧的编译器。(当我迁移到Xcode5并想要使用最新的Obj-C新特性时,这几次让我遇到了麻烦。)
最近,我总是在构建选项中选择“默认编译器”。
https://stackoverflow.com/questions/20939291
复制相似问题