Выпущен ли буквальный NSString автоматически или его нужно выпустить?

При создании строки используются следующие обозначения:

NSString *foo = @"Bar";

Нужно ли выпустить foo? Или в этом случае foo автоматически выпускается?


person Coocoo4Cocoa    schedule 01.12.2008    source источник
comment
Прошу прощения, что слишком поздно добавил ответ, но я думаю, вам следует проверить его на полноту, поскольку в ответе Бена есть ошибка.   -  person Madhup Singh Yadav    schedule 17.12.2010


Ответы (3)


Выделенные компилятором строки (формата @ "STRING") являются постоянными, поэтому сообщения -retain, -release и -autorelease игнорируются. В этом случае вам не нужно отпускать или автоматически выпускать foo (но это не повредит).

person Ben Gottlieb    schedule 01.12.2008
comment
Я обнаружил, что освобождение foo приводит к сбою моей программы, когда освобождаемый указатель не выделяется - person bobobobo; 02.11.2009
comment
@bobobobo Полностью согласен с вами. - person Madhup Singh Yadav; 17.12.2010

Как упоминалось в документах

http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Tasks/MemoryManagementRules.html

Вы становитесь владельцем объекта, если вы создаете его с помощью метода, имя которого начинается с «alloc» или «new» или содержит «копию» (например, alloc, newObject или mutableCopy), или если вы отправляете ему сообщение о сохранении. Вы несете ответственность за отказ от владения объектами, которыми вы владеете, с помощью выпуска или автоматического выпуска. В любой другой раз, когда вы получите объект, вы не должны его отпускать.

Поскольку вы не используете alloc, copy и т. Д., Вам не нужно беспокоиться об освобождении объекта.

person August    schedule 01.12.2008
comment
Что-нибудь изменится после ARC? Я прочитал, что строковые литералы остаются в памяти и уничтожаются, когда программа перестает работать. Следует предпочесть создание строк с использованием alloc вместо литералов? - person rohan-patel; 14.10.2014

Я согласен с @Ben \ Gottlieb в "Строки, выделенные компилятором (формата @" STRING ") являются константами", но поскольку вы не инициализировали их, передавая сообщение alloc или retain, вы не должны передавать им сообщение release или autorelease в противном случае ваше приложение выйдет из строя со следующим журналом

"освобождаемый указатель не был выделен"

ПРИМЕЧАНИЕ

NSString *str = [NSString string];

эквивалентно:

NSString *str = [[[NSString alloc] init] autorelease];

поэтому release или autorelease также нельзя передавать здесь.

person Madhup Singh Yadav    schedule 17.12.2010