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

我怎样才能得到一个新NSStringaCFString

4

8 回答 8

355

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 来释放它们。

于 2009-03-12T20:37:33.023 回答
18

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

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

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

于 2013-03-01T01:38:46.380 回答
12

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

NSString *aNSString = (NSString*)aCFString;

有关详细信息,请参阅免费桥接类型

于 2009-03-12T20:37:20.917 回答
4

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

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

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

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

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


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

于 2010-04-15T22:01:16.080 回答
3

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

结果代码:

NSString *escapedString;
NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];
于 2009-03-13T00:27:44.063 回答
2

我遇到了 ARC 和 CFStrings 的保留计数的问题。使用 NilObjects 答案稍加调整对我来说非常完美。我刚刚添加了保留,例如。

CFStringRef cfstringRef = (__bridge_retained  CFStringRef)aNsString;
于 2012-07-05T22:00:09.490 回答
0

你必须投它:

CFStringRef CFstringFileName=(__bridge CFStringRef)NSstringFileName;
于 2012-10-29T09:12:57.050 回答
-3

您可以使用 :With CFStringRef idc;

NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];
于 2013-10-17T05:19:34.860 回答