Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 如何将CFStringRef转换为NSString?_Cocoa_String_Cfstring - Fatal编程技术网

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];