programing

CFStringRef를 NSstring으로 변환하는 방법은?

yellowcard 2023. 11. 6. 21:44
반응형

CFStringRef를 NSstring으로 변환하는 방법은?

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

새것을 구하려면 어떻게 해야 합니까?NSString부터aCFString?

NSSstring과 CFStringRef는 "Toll free bridged"로 둘 사이에 간단히 캐스트를 입력할 수 있습니다.

예를 들어,

CFStringRef aCFString = (CFStringRef)aNSString;

완벽하고 투명하게 작동합니다.마찬가지로:

NSString *aNSString = (NSString *)aCFString;

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

NSString *aNSString = (__bridge NSString *)aCFString;

효과도 있습니다.핵심 사항은 코어 파운데이션이 +1개의 참조 개수를 가진 객체를 종종 반환한다는 것이며, 이는 객체를 해제해야 한다는 것을 의미합니다(모든 CF[Type]Create format 기능이 이 작업을 수행함).

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

Mac OS X/Objective C의 최신 버전에서 ARC를 사용하는 경우, 이는 매우 간단합니다.

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

그러나 Xcode는 NSSstring에 무료 브리지 CFString을 허용하고 CFBridging Release()에 자동으로 포장을 제안할 때 기쁜 마음으로 경고합니다. CFBridging Release()는 이 옵션을 클릭하면 수락할 수 있으며 포장지를 자동으로 삽입할 수 있습니다.

이들은 동등하므로 CFStringRef를 캐스팅만 하면 됩니다.

NSString *aNSString = (NSString*)aCFString;

자세한 내용은 수신자 부담 브리지 유형을 참조하십시오.

실제로 일반적으로 Core Foundation 객체에 대해 Cocoa retain, release, auto release를 사용해서는 안 됩니다.Garbage Collection(지금은 Mac OS X에서만)을 사용하는 경우 유지, 해제, 자동 해제 통화는 모두 금지됩니다.따라서 메모리가 누출됩니다.

Apple http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html 에서:

코어 파운데이션과 코코아 사이의 비대칭성을 이해하는 것이 중요합니다. 코어 파운데이션은 유지, 해제 및 자동 해제가 불가능합니다.예를 들어 CFCreate…를 릴리스 또는 자동 릴리스와 균형을 맞춘 경우 가비지 수집 환경에서 개체가 누출됩니다.

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

반대로 CFRelease를 사용하여 이전에 보존한 개체를 릴리스하면 참조 카운트 언더플로우 오류가 발생합니다.


추신: 피터 호시의 대답에 대해 언급할 수 없는 것 같습니다. 불필요하게 제 것을 추가해서 죄송합니다.

Type-cast만으로 CFString에서 NSSstring으로 이동할 수 있을 뿐만 아니라 반대로 동작할 수도 있다는 점을 덧붙이겠습니다.드랍하시면 됩니다.CFStringCreateWithCString나중에 릴리스해야 하는 메시지가 하나 더 적습니다. (CF는Create코코아가 사용하는 곳alloc, 그래서 어느 쪽이든, 당신은 그것을 풀어줘야만 했을 것입니다.)

결과 코드:

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

ARC와 CFS 문자열의 리텐션 카운트에 문제가 있었습니다.NilObjects의 답변을 약간 수정해서 사용하는 것은 저에게 완벽하게 효과적이었습니다.저는 그냥 남은 달걀을 넣었습니다.

CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;

캐스팅해야 합니다.

CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName;

다음을 사용할 수 있습니다.CFStringRefidc 포함;

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];

언급URL : https://stackoverflow.com/questions/640367/how-to-convert-cfstringref-to-nsstring

반응형