ios - CF_IMPLICIT_BRIDGING_ENABLED 在 xcode5 中不起作用?

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

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/

相关文章:

ios - 基于 NSExpression 的核心数据提取不检索当前值(iOS 5、GCD)

ios - CloudKit:CKRecord 问题(或错误?)的 creatorUserRecordID

ios - 无法在 Xcode 中查看配置文件

ios - 我应该使用类别还是自定义帮助器类?

swift - 我们是否应该始终在 Swift 中的闭包内使用 [unowned self]

ios - 如何在不阻止用户与 UIWebView 交互的情况下在 UIWebView 上显示覆盖

objective-c - 如何正确切换 View

ios - 无法在 KVO 观察者方法中获取新值

ios - ARC (iOS) 下的 Delphi TThread 未发布

ios - 啊!不允许 ARC 错误 :'CFTypeRef' (又名 'const void *' )到 'NSNumber *'