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

我怎样才能得到一个新的 NSStringaCFString?

有帮助吗?

解决方案

NSString 和 CFStringRef 是“免费桥接”,这意味着您可以在它们之间简单地进行类型转换。

例如:

CFStringRef aCFString = (CFStringRef)aNSString;

工作完美且透明。同样地:

NSString *aNSString = (NSString *)aCFString;

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

NSString *aNSString = (__bridge NSString *)aCFString;

也有效。需要注意的关键是 CoreFoundation 通常会返回引用计数为 +1 的对象,这意味着它们需要被释放(所有 CF[Type]Create 格式函数都会执行此操作)。

好处是在 Cocoa 中你可以安全地使用 autorelease 或release来释放它们。

其他提示

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

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

但是,当您尝试免费向NSString收费并提出将其包装在CFBridGingRelease()中时,Xcode会很乐意警告您,如果您单击该选项,则可以将其包装在CFBridGingRelease()中。

它们是等效的,因此您只需转换 CFStringRef:

NSString *aNSString = (NSString*)aCFString;

欲了解更多信息,请参阅 免费桥接类型.

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

来自苹果 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保留的对象将导致引用计数下溢错误。


附:似乎无法评论彼得·霍西的答案 - 抱歉添加了我自己的不必要的答案。

我要补充的是,您不仅可以仅通过类型转换从 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;

您可以使用:With CFStringRef idc;

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top