Возвращается @ "Текст";autoreleased? - PullRequest
2 голосов
/ 27 октября 2010

Интересно, если

return @"Text";

автоматически выпущен? И если это так, объясните, пожалуйста.

Компилятор создает для нас объект NSString или как компилятор справится с этим?

Ответы [ 3 ]

5 голосов
/ 27 октября 2010

Нет, это не так.

@"Text" является константной строкой, это означает, что один и тот же объект возвращается при каждом запуске строки и никогда не освобождается.

- (void)release - это неоперативный метод. Если вы посмотрите на класс, то увидите, что это не обычная строка NSString.

3 голосов
/ 27 октября 2010

Константы NSStrings компилируются в двоичный файл приложения. Их освобождение не имеет смысла, поскольку используемая ими память доступна только для чтения, не поступает из кучи и не может быть переработана. Если вы посмотрите на счет сохранения постоянной строки NSS, то увидите, что для нее установлено какое-то астрономически высокое число (я думаю, 2 ^ 31-1). Соглашение состоит в том, что -release, отправленный объекту с таким счетом хранения, ничего не делает, равно как и -retain. Следовательно, отправка -autorelease также ничего не делает, кроме добавления строки в пул автоматического выпуска (на самом деле, даже это может быть оптимизировано).

С точки зрения владения (именно так вы должны думать об этом), относитесь к константным строкам NSS точно так же, как ко всему прочему. Вы не получаете его, используя new, alloc или copy, поэтому, если вы не сохраните его, вы не будете его владельцем. Таким образом, вам также не нужно автоматически выпускать его в вашем примере перед его возвратом.

Вызывающий должен сохранить возвращаемое значение, если он хочет сохранить его, даже если -retain действительно ничего не делает. Это делает ваш код более общим, поэтому, если (например) ваш метод был изменен так, чтобы он возвращал непостоянную строку NSString, вам не нужно беспокоиться об изменении всех вызывающих.

0 голосов
/ 27 октября 2010

Да.

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

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