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