![](/img/trans.png)
[英]How to convert a NSString to UTf8string for using multiple languages?
[英]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
现在,您可以根据需要将storage
和yourCString
给任何保留/释放存储的函数,当storage
的保留计数变为0时,您的yourCString
指向的内存也将被释放。
我使用它来保留一个非常长的字符串的单个副本,同时在bean中创建由strtok_r
创建的strtok_r
,并且只有在释放所有bean时才释放内存。
如此处所述http://boredzo.org/blog/archives/2012-06-03/characters-in-nsstring dataUsingEncoding:
应该添加BOM但我已经使用调试器进行了检查,并且返回的字节中没有BOM 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.