Как преобразовать NSString в char *, используя UTF8String, как его сохранить? - PullRequest
2 голосов
/ 06 июля 2010

При преобразовании NSString в символ * с использованием UTF8String, как его сохранить?

Согласно следующей ссылке, при использовании UTF8String возвращаемый символ * в значительной степени автоматически высвобождается, поэтому он не будет длиться долгоза пределами текущей функции: http://developer.apple.com/mac/library/documentation/cocoa/reference/Foundation/Classes/NSString_Class/Reference/NSString.html#jumpTo_128

Он говорит, что я должен скопировать или что-то, чтобы сохранить его.Как я могу это сделать?

Причина, по которой я спрашиваю, состоит в том, что если я делаю [myCharPointer retain], он не сохраняет его, потому что это не объект obj-c, а указатель переменного тока.

Спасибо

Ответы [ 3 ]

6 голосов
/ 06 июля 2010

Вы можете использовать strdup()

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

Когда вы закончите с stringIWantToKeep, вы освобождаете его, как если бы оно изначально было malloc'd.

2 голосов
/ 06 июля 2010

Попробуйте использовать -getCString: maxLength: кодировка: , например ::

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!
}
0 голосов
/ 14 февраля 2014

Если вам нужен объект для сохранения / освобождения, как и для любого другого объекта, вы можете сделать следующее:

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

Теперь вы можете передавать как storage, так и yourCString в любую функцию, сохраняющую / освобождающую память по своему усмотрению, когда счетчик хранения storage станет равным 0, память, указанная yourCString, также будет освобождена.

Я использовал это, чтобы сохранить одну копию очень длинной строки при наличии ссылок, созданных strtok_r в bean-компонентах, и освобождать память только после того, как были освобождены все bean-компоненты.

Небольшая заметка о (отсутствует) спецификации:

Как указано здесь http://boredzo.org/blog/archives/2012-06-03/characters-in-nsstring dataUsingEncoding: должен добавить спецификацию, но я проверил с помощью отладчика, и в возвращаемых байтах нет спецификации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...