【问题标题】:CF_IMPLICIT_BRIDGING_ENABLED non-functional in xcode5?CF_IMPLICIT_BRIDGING_ENABLED 在 xcode5 中不起作用?
【发布时间】:2014-01-23 05:26:32
【问题描述】:

WWDC 2013 讲座幻灯片包含一个部分,在某些情况下可以省略显式桥接演员表。我在 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);

并认为关于隐式桥接的新工作应该让我能够写这个。但这也需要一个过渡演员。

【问题讨论】:

  • 当您说“使用 10.8”时,您能更具体一点吗?有三件事在起作用:您正在运行的操作系统、SDK 和部署目标
  • 无论 Xcode 是在 10.8 还是 10.9 上运行,我都会得到相同的结果。另外,如果部署目标是 ios7 或 10.9,结果也是一样的。

标签: ios objective-c automatic-ref-counting xcode5 core-foundation


【解决方案1】:

这似乎是一种黑魔法,但根据我的实验,其中带有“创建”的函数不适用于隐式桥接。

当我编译这个时:

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();
}

前两个失败,但第三个“有效”。

请注意,隐式桥接显然 STILL 实际上并不会阻止编译器警告您将 CFStringRef 转换为 NSString *,它只是不再要求您插入 __bridge。

您会注意到,在 WWDC2013 的第 404 节 50:30 的幻灯片中,他使用了 CFDictionaryGetValue(),它返回一个“void *”,因此它是少数几个不会发出警告的函数之一。任何返回实际类型的 CF 函数(例如 CFStringRef 或 CFDictionary)仍然会抛出警告,所以,嗯。

【讨论】:

    【解决方案2】:

    检查项目和/或目标的编译器设置。如果这是一个较旧的项目,您可能会有一个杂散选项导致您使用较旧的编译器。 (当我迁移到 Xcode 5 并想使用最新的 Obj-C 新事物时,这让我有几次绊倒。)

    这些天来,我总是在构建选项中选择“默认编译器”。

    【讨论】:

      猜你喜欢
      • 2013-09-25
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      相关资源
      最近更新 更多