2

WWDC 2013演講幻燈片包含一個部分,在某些情況下,可以省略顯式橋接演員。我在Xcode 5中編寫了這個(使用10.8,而不是10.9),編譯器抱怨我需要橋接模型。我完全不理解這個概念嗎?CF_IMPLICIT_BRIDGING_ENABLED在xcode5中不起作用?

#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); 

,並認爲內隱橋新的工作應該簡單地讓我寫這個。但是這也需要一個橋接角色。

+0

當你說「使用10.8」時,你能更具體嗎?有三件事:遊戲運行的操作系統,SDK和部署目標 –

+0

無論Xcode是在10.8還是10.9上運行,我都會得到相同的結果。另外,如果部署目標是ios7或10.9,那麼結果也是一樣。 – davidbaraff

回答

0

檢查項目和/或目標上的編譯器設置。如果這是一個較老的項目,那麼您可能會有一個流浪的選項,導致您使用較舊的編譯器。 (當我轉移到Xcode 5並且想要使用最新的Obj-C新功能時,這讓我絆了好幾次。)

這些天,我總是在我的構建選項中選擇「Default compiler」。

2

這似乎是一種黑魔法,但從我的實驗功能與「創建」在他們不適用於隱式橋接。

當我編譯如下:

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。

你會注意到在50:30的會話404中的WWDC2013幻燈片中,他使用CFDictionaryGetValue(),它返回一個「void *」,所以它是少數不會引發警告的函數之一。任何返回實際類型的CF函數(例如CFStringRef或CFDictionary)仍然會引發警告,所以,meh。

相關問題