문제

NSString *aNSString;
CFStringRef aCFString;
aCFString = CFStringCreateWithCString(NULL, [aNSString UTF8String], NSUTF8StringEncoding);
aCFString = CFXMLCreateStringByUnescapingEntities(NULL, aCFString, NULL);

새로운 것을 어떻게 얻을 수 있습니까? NSString ~에서 aCFString?

도움이 되었습니까?

해결책

NSString과 CFStringRef는 "톨 프리 브리지"이므로 단순히 그들 사이에서 타입 캐스트 할 수 있습니다.

예를 들어:

CFStringRef aCFString = (CFStringRef)aNSString;

완벽하고 투명하게 작동합니다. 비슷하게:

NSString *aNSString = (NSString *)aCFString;

이전 구문은 MRC에 대한 것입니다. ARC를 사용하는 경우 새로운 캐스팅 구문은 다음과 같습니다.

NSString *aNSString = (__bridge NSString *)aCFString;

작동합니다. 주목해야 할 주요 사항은 CoreFoundation이 종종 +1 참조 카운트를 가진 객체를 반환한다는 것입니다. 즉, 릴리스해야합니다 (모든 CF [유형] 형식 기능을 작성합니다).

좋은 점은 코코아에서는 자동 제출 또는 해제를 위해 안전하게 사용하여 해제 할 수 있다는 것입니다.

다른 팁

Mac OS X/Objective C의 최근 버전에서 ARC를 사용하는 경우 진짜 쉬운:

NSString *happyString = (NSString *)CFBridgingRelease(sadString);

그러나 Xcode는 NSString에 무료 브리지 CFString을 통행하고 CFBridgingRelease ()에 자동으로 래핑하도록 제안 할 때 Xcode가 행복하게 경고합니다. 옵션을 클릭하면 래퍼를 자동으로 삽입 할 수 있습니다.

그것들은 동등하기 때문에 cfstringref를 캐스팅 할 수 있습니다.

NSString *aNSString = (NSString*)aCFString;

자세한 내용은 참조하십시오 통행료가없는 브리지 유형.

실제로 Core Foundation Objects에서 Cocoa Retain, Release, AutoreLease를 일반적으로 사용해서는 안됩니다. 쓰레기 수집을 사용하는 경우 (현재 Mac OS X에서만) 보유, 릴리스, 자동 제출 호출은 모두 NO-OPS입니다. 따라서 메모리 누출.

애플에서 http://developer.apple.com/mac/library/documentation/cocoa/conceptual/garbagecollection/articles/gccorefoundation.html:

Core Foundation과 Cocoa 사이의 비대칭 성을 이해하는 것이 중요합니다. 이곳에서 유지, 방출 및 자동 제출은 No-OPS입니다. 예를 들어, CFCreate의 균형을 잡은 경우… 릴리스 또는 자동 제출을 통해 쓰레기 수집 된 환경에서 물체를 누출하게됩니다.

NSString *myString = (NSString *)CFStringCreate...(...);
// do interesting things with myString...
[myString release]; // leaked in a garbage collected environment

반대로, CfrELEASE를 사용하여 이전에 RETAIN을 사용하여 유지 한 객체를 해제하면 기준 수 언더 플로 오류가 발생합니다.


추신 : Peter Hosey의 답변에 대해 언급 할 수없는 것 같습니다. 불필요하게 내 자신을 추가하여 죄송합니다.

나는 당신이 CFString에서 유형 캐스트만으로 NSString으로 갈 수있을뿐만 아니라 다른 방식으로도 작동한다고 덧붙였다. 당신은 그것을 떨어 뜨릴 수 있습니다 CFStringCreateWithCString 메시지, 나중에 릴리스해야 할 것 중 하나입니다. (CF 사용 Create 코코아가 사용하는 곳 alloc, 어느 쪽이든, 당신은 그것을 공개해야했을 것입니다.)

결과 코드 :

NSString *escapedString;
NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];

나는 ARC와 CFStrings를 유지하는 데 문제가있었습니다. 약간의 조정으로 Nilobjects 답변을 사용하면 나에게 완벽하게 작동했습니다. 방금 유지 된 예를 들어 추가했습니다.

CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;

당신은 그것을 캐스팅해야합니다 :

CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName;

Youcan 사용 : CFStringRef IDC와 함께;

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top