Как память возвращаемых типов C обрабатывается в GC? - PullRequest
8 голосов
/ 05 июня 2011

Согласно документации по методу NSString -UTF8String:

Возвращенная строка C автоматически освобожден так же, как возвращаемый объект быть выпущеным; Вы должны скопировать C строка, если нужно хранить ее снаружи контекста аутрелиза, в котором строка C создана.

Таким образом, при управлении сохранением / освобождением памяти используется следующий метод:

- (const char*) giveMeACString
{
    NSString* string = @"I'm a string!";
    return [string UTF8String];
}

нормально, если вызывающий метод обрабатывает возвращенный константный символ *, как если бы он был автоматически освобожден.

Тем не менее, насколько я знаю, под сборкой мусора нет контекста автоматического выпуска. А типы C не являются сборщиком мусора, поэтому не похоже, что GC будет обрабатывать возвращаемый указатель так же, как возвращаемый объект.

С чем связана его продолжительность жизни? Он все еще освобожден в точке цикла выполнения потока, которая надежно «позже», или он ведет себя по-другому в GC, чем в не-GC?

Ответы [ 2 ]

2 голосов
/ 05 июня 2011

Я думаю, что память выделяется из памяти, собранной мусором, и тип возвращаемого значения - __strong const char*. Это означает, что он будет собираться обычным способом, когда он недоступен из корневого набора указателей.

Это в основном означает, что вам нужно сохранить его в переменной-указателе, помеченной как __strong, иначе она будет собрана в какой-то момент.

Я бы предположил, что неизменяемая строка поддерживает ссылку на саму версию UTF8, поэтому она должна вычислять ее только один раз, и поэтому строка UTF8 , вероятно, не исчезнет, ​​пока NSString не выполнит вот почему вам не нужно беспокоиться о том, что оно исчезнет нормально.

0 голосов
/ 05 июня 2011

Поскольку вы не выделяли эти пробелы явно, вам не нужно беспокоиться об освобождении.

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