如何将CFStringRef转换为NSString?

时间:2009-03-12 20:33:29

标签: cocoa string cfstring

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

如何从NSString获取新的aCFString

8 个答案:

答案 0 :(得分:344)

NSString和CFStringRef是“Toll free bridged”,这意味着你可以简单地在它们之间进行类型转换。

例如:

CFStringRef aCFString = (CFStringRef)aNSString;

完美而透明地运作。同样地:

NSString *aNSString = (NSString *)aCFString;

以前的语法适用于MRC。如果您使用的是ARC,则新的转换语法如下:

NSString *aNSString = (__bridge NSString *)aCFString;

也可以。需要注意的关键是CoreFoundation经常返回带有+1引用计数的对象,这意味着它们需要被释放(所有CF [Type] Create格式函数都会这样做)。

好消息是,在Cocoa中你可以安全地使用自动释放或释放来释放它们。

答案 1 :(得分:16)

如果您在最新版本的Mac OS X / Objective C中使用ARC, 这是真实的简单:

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

然而,当您尝试免费桥接时,Xcode会很高兴地警告您 CFString到NSString并提供自动将其包装在CFBridgingRelease()中, 您可以接受并让它在您单击选项时自动为您插入包装。

答案 2 :(得分:12)

它们是等价的,所以你可以直接转换CFStringRef:

NSString *aNSString = (NSString*)aCFString;

有关详细信息,请参阅Toll-Free Bridged Types

答案 3 :(得分:4)

实际上,一般情况下,不应在Core Foundation对象上使用Cocoa保留,释放,自动释放。如果您正在使用垃圾收集(目前仅在Mac OS X上使用),那些保留,释放,自动释放调用都是无操作。因此内存泄漏。

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

重要的是要理解Core Foundation和Cocoa之间的不对称 - 其中保留,释放和自动释放都是无操作。例如,如果您使用release或autorelease平衡了CFCreate ...,那么您将在垃圾收集环境中泄漏对象:

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

相反,使用CFRelease释放先前使用retain保留的对象将导致引用计数下溢错误。


PS:似乎无法评论Peter Hosey的回答 - 抱歉不必要地添加我自己的回答。

答案 4 :(得分:3)

我将补充一点,你不仅可以使用类型转换从CFString转到NSString,而且它也可以用另一种方式工作。您可以删除CFStringCreateWithCString消息,这是您稍后需要发布的消息。 (CF使用Create Cocoa使用alloc,所以无论哪种方式,你都需要释放它。)

结果代码:

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

答案 5 :(得分:2)

我遇到了ARC的问题以及CFStrings的保留计数。使用NilObjects回答稍加调整对我来说非常适合。我刚刚添加了保留例如。

CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;

答案 6 :(得分:0)

你必须施展它:

CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName;

答案 7 :(得分:-3)

您可以使用:使用CFStringRef idc;

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