如何将CFStringRef转换为NSString?

pap*_*apr 165 string cocoa cfstring

NSString *aNSString;
CFStringRef aCFString;
aCFString = CFStringCreateWithCString(NULL, [aNSString UTF8String], NSUTF8StringEncoding);
aCFString = CFXMLCreateStringByUnescapingEntities(NULL, aCFString, NULL);
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到一个新NSStringaCFString

Nil*_*ect 346

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

例如:

CFStringRef aCFString = (CFStringRef)aNSString;
Run Code Online (Sandbox Code Playgroud)

完美而透明地工作.同样:

NSString *aNSString = (NSString *)aCFString;
Run Code Online (Sandbox Code Playgroud)

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

NSString *aNSString = (__bridge NSString *)aCFString;
Run Code Online (Sandbox Code Playgroud)

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

好的是,在Cocoa中,您可以安全地使用自动释放或释放来释放它们.

  • 如果您正在使用ARC,则此案例的新强制转换语法现在为NSString*aNSString =(__ bridge NSString*)aCFString (87认同)
  • 谢谢MikeG,我不得不做类似的逆转换:NSString*str = @"abc"; CFStringRef cstrref =(__ bridge CFStringRef)str; (6认同)
  • @NilObject请更新您的答案以包括ARC,以便搜索者不必查看评论.谢谢. (2认同)

cle*_*ght 16

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

NSString *happyString = (NSString *)CFBridgingRelease(sadString);
Run Code Online (Sandbox Code Playgroud)

但是,当您尝试将自由桥接CFString转换为NSString并提供自动将其包装在CFBridgingRelease()中时,Xcode会很高兴地警告您,您可以接受它并让它在您单击该选项时自动为您插入包装器.

  • 我不确定,但是我认为`(__bridge NSString *)`就足够了:用`CFBridgingRelease()`增加保留计数是没有意义的。 (2认同)

Mar*_*ote 12

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

NSString *aNSString = (NSString*)aCFString;
Run Code Online (Sandbox Code Playgroud)

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