【问题标题】:When converting a NSString to a char* using UTF8String, how to retain it?使用 UTF8String 将 NSString 转换为 char* 时,如何保留它?
【发布时间】:2010-07-06 14:18:02
【问题描述】:

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

根据以下链接,当您使用 UTF8String 时,返回的 char* 几乎是自动释放的,因此它不会持续超出当前功能:http://developer.apple.com/mac/library/documentation/cocoa/reference/Foundation/Classes/NSString_Class/Reference/NSString.html#jumpTo_128

它说我必须复制它或保留它。我该怎么做?

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

谢谢

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

    您可以使用strdup()

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

    当你用完stringIWantToKeep,你释放它,就像它最初是malloc'd。

    【讨论】:

      【解决方案2】:

      尝试使用-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!
      }
      

      【讨论】:

      • 我不需要 malloc +1 字节作为空终止符吗?
      • 小心!虽然这永远不会崩溃,但如果您的原始 NSString 包含 UNICODE 字符(在标准 ASCII 集之外),您只会在 utf8Buffer 中获得部分字符串。 [字符串长度] 返回缓冲区中 UNICODE 字符的数量,该数量小于以 UTF8 呈现它所需的大小。使用 [string lengthOfBytesUsingEncoding: NSUTF8StringEncoding];得到实际长度。
      【解决方案3】:

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

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

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

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

      关于(缺失)BOM 的一点说明:

      正如这里所说的http://boredzo.org/blog/archives/2012-06-03/characters-in-nsstringdataUsingEncoding: 应该添加 BOM,但我已经用调试器检查过,在返回的字节中没有 BOM

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-26
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2012-06-20
        • 1970-01-01
        相关资源
        最近更新 更多