Cocoa 如何将CFStringRef转换为NSString?
如何从Cocoa 如何将CFStringRef转换为NSString?,cocoa,string,cfstring,Cocoa,String,Cfstring,如何从aCFString获取新的NSString?它们是等效的,因此您可以强制转换CFStringRef: NSString *aNSString; CFStringRef aCFString; aCFString = CFStringCreateWithCString(NULL, [aNSString UTF8String], NSUTF8StringEncoding); aCFString = CFXMLCreateStringByUnescapingEntities(NULL, aCFSt
aCFString
获取新的NSString
?它们是等效的,因此您可以强制转换CFStringRef:
NSString *aNSString;
CFStringRef aCFString;
aCFString = CFStringCreateWithCString(NULL, [aNSString UTF8String], NSUTF8StringEncoding);
aCFString = CFXMLCreateStringByUnescapingEntities(NULL, aCFString, NULL);
有关更多信息,请参阅。NSString和CFStringRef是“免费桥接”的,这意味着您可以在它们之间简单地进行类型转换 例如:
NSString *aNSString = (NSString*)aCFString;
工作完美且透明。同样地:
CFStringRef aCFString = (CFStringRef)aNSString;
前面的语法是针对MRC的。如果使用的是ARC,则新的强制转换语法如下所示:
NSString *aNSString = (NSString *)aCFString;
同样有效。需要注意的关键是,CoreFoundation通常会返回具有+1引用计数的对象,这意味着它们需要被释放(所有CF[Type]Create format函数都会这样做)
很好的一点是,在Cocoa中,您可以安全地使用autorelease或release来释放它们。我要补充的是,您不仅可以通过一个类型转换从CFString转换到NSString,而且还可以通过另一种方式工作。您可以删除
CFStringCreateWithCString
消息,这是以后需要发布的少一件事。(CF使用Create
,而Cocoa使用alloc
,因此无论哪种方式,您都需要释放它。)
生成的代码:
NSString *aNSString = (__bridge NSString *)aCFString;
事实上,你不应该把可可保留、释放、自动保存在核心基础对象上。如果您正在使用垃圾收集(目前仅在MacOSX上),那么那些保留、释放和自动释放调用都是不可操作的。因此内存泄漏 来自苹果: 重要的是要了解核心基础和可可之间的不对称性,其中保留、释放和自转不是OPS。例如,如果已将CFCreate…与release或autorelease平衡,则将在垃圾收集环境中泄漏该对象:
NSString *escapedString;
NSString *unescapedString = [(NSString *) CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef) escapedString, NULL) autorelease];
相反,使用CFRelease释放以前使用retain保留的对象将导致引用计数下溢错误
PS:似乎无法对Peter Hosey的答案发表评论-很抱歉不必要地添加了我自己的答案。我对ARC和CFstring的保留计数有问题。对我来说,使用NilObjects进行轻微调整后,效果非常好。我刚才加了一句
NSString *myString = (NSString *)CFStringCreate...(...);
// do interesting things with myString...
[myString release]; // leaked in a garbage collected environment
你必须投下它:
CFStringRef cfstringRef = (__bridge_retained CFStringRef)aNsString;
如果您在最新版本的Mac OS X/Objective C中使用ARC, 这很容易: 然而,当您尝试免费桥接时,Xcode会很高兴地警告您 CFString到NSString,并提供自动将其包装在CfBrigingRelease()中,
如果单击该选项,您可以接受并让它自动为您插入包装器。您可以使用:With CFStringRef idc
NSString *happyString = (NSString *)CFBridgingRelease(sadString);
如果您使用的是ARC,那么这种情况下的新强制转换语法现在是NSString*aNSString=(u_桥NSString*)aCFStringThanks MikeG,我必须对反向转换执行类似操作:NSString*str=@“abc”;CFStringRef cstrref=(uu桥CFStringRef)str@NilObject请更新您的答案以包含ARC,这样搜索者就不必检查评论。谢谢。我不确定,但我认为
(\uu-bridge-NSString*)
足够了:用CfBrigingRelease()
增加保留计数没有意义。
NSString *happyString = (NSString *)CFBridgingRelease(sadString);
NSString *sId = [NSString stringWithFormat:@"%@", (NSString*)idc];