2

WWDC 2013 강의 슬라이드에는 명시 적 브리징 캐스트를 생략 할 수있는 섹션이 포함되어 있습니다. 나는 이것을 Xcode 5 (10.9가 아니라 10.8 사용)에 썼다. 그리고 컴파일러는 브리징 캐스트가 필요하다고 불평한다. 나는 그 개념을 완전히 이해하지 못하고 있는가?xcode5에서 CF_IMPLICIT_BRIDGING_ENABLED가 작동하지 않습니까?

NSString* s = CFUUIDCreateString(NULL, uuid); 

을 암시 적 브리징의 새로운 작업은 단순히이 쓰기 저를 활성화해야한다고 생각 :

#import <Foundation/Foundation.h> 

CF_IMPLICIT_BRIDGING_ENABLED 
CFStringRef MyCreateStringFromNothing(); 
CF_IMPLICIT_BRIDGING_DISABLED 

void SomeFunction() { 
    // compiler requires bridging cast here... 
    NSString* x = MyCreateStringFromNothing();  
} 

물어 이유는 내가 쓰고 싶다입니다. 그러나 이것은 또한 브리징 캐스트가 필요합니다.

+0

"10.8 사용"이라고 말하면 더 구체적으로 표현할 수 있습니까? 실행중인 OS, SDK 및 배포 대상은 세 가지입니다. –

+0

Xcode가 10.8 또는 10.9에서 실행되는지 여부에 관계없이 동일한 결과가 나타납니다. 또한 배포 대상이 ios7 또는 10.9 인 경우에도 동일한 결과가 나타납니다. – davidbaraff

답변

0

프로젝트 및/또는 대상에서 컴파일러 설정을 확인하십시오. 이 프로젝트가 오래된 프로젝트라면 오래된 컴파일러를 사용할 수있는 길잃은 옵션이있을 수 있습니다. (Xcode 5로 옮겨서 Obj-C의 새로운 기능을 사용하고 싶었을 때 몇 번이나 나를 트립 시켰습니다.)

요즘은 항상 빌드 옵션에서 "기본 컴파일러"를 선택합니다.

2

이것은 일종의 검은 마법처럼 보입니다. 그러나 내 실험에서 "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도 삽입해야한다는 요구가 중지됩니다.

세션 404의 50:30에 WWDC2013 슬라이드에서 "void *"를 반환하는 CFDictionaryGetValue()를 사용하므로 경고를 발생시키지 않는 몇 가지 기능 중 하나임을 알 수 있습니다. 실제 유형을 반환하는 CF 함수 (예 : CFStringRef 또는 CFDictionary)는 여전히 경고를 발생시킵니다.