繁体   English   中英

使用UTF8String将NSString转换为char *时,如何保留它?

[英]When converting a NSString to a char* using UTF8String, how to retain it?

使用UTF8String将NSString转换为char *时,如何保留它?

根据以下链接,当您使用UTF8String时,返回的char *几乎是自动释放的,因此它不会超出当前函数: http//developer.apple.com/mac/library/documentation/cocoa/reference/基金会/班/ NSString_Class /参考/ NSString.html#jumpTo_128

它说我必须复制它或其他东西来保持它。 我怎样才能做到这一点?

我问的原因是,如果我[myCharPointer retain]它不保留它,因为它不是obj-c对象,它是ac指针。

谢谢

你可以使用strdup()

const char* utf8Str = [@"an example string" UTF8String];
if (utf8Str != NULL) 
{
    stringIWantToKeep = strdup(utf8Str);
}

当你完成stringIWantToKeep ,你就可以释放它,好像它最初是malloc的。

尝试使用-getCString:maxLength:encoding : ,例如:

NSUInteger bufferCount = sizeof(char) * ([string length] + 1);
const char *utf8Buffer = malloc(bufferCount);
if ([string getCString:utf8Buffer 
             maxLength:bufferCount 
              encoding:NSUTF8StringEncoding]) {
    NSLog("Success! %s", utf8Buffer);
    free(utf8Buffer); // Remember to do this, or you will get a memory leak!
}

如果您需要一个对象来保留/释放每个其他对象,您可以执行以下操作:

NSData* storage= [yourNSString dataUsingEncoding:NSUTF8StringEncoding];
char* yourCString= (char*)storage.bytes;
// your code flow here

现在,您可以根据需要将storageyourCString给任何保留/释放存储的函数,当storage的保留计数变为0时,您的yourCString指向的内存也将被释放。

我使用它来保留一个非常长的字符串的单个副本,同时在bean中创建由strtok_r创建的strtok_r ,并且只有在释放所有bean时才释放内存。

关于(缺少)BOM的一点注意事项:

如此处所述http://boredzo.org/blog/archives/2012-06-03/characters-in-nsstring dataUsingEncoding:应该添加BOM但我已经使用调试器进行了检查,并且返回的字节中没有BOM

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM