WWDC 2013 讲座幻灯片包含一个部分,在某些情况下可以省略显式的桥接 Actor 。我在 Xcode 5 中编写了这个(虽然使用的是 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);
并且认为关于隐式桥接的新工作应该能让我写出这篇文章。但这还需要一个桥接 Actor 。
最佳答案
这似乎有点黑魔法,但从我的实验来看,带有“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。
您会注意到,在 WWDC2013 第 404 场 session 50:30 的幻灯片中,他使用了 CFDictionaryGetValue(),该函数返回“void *”,因此它是少数不会发出警告的函数之一。任何返回实际类型的 CF 函数(例如 CFStringRef 或 CFDictionary)仍然会抛出警告,所以,嗯。
关于ios - CF_IMPLICIT_BRIDGING_ENABLED 在 xcode5 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20939291/