Является ли буквально NSString автоматически выпущенным или его нужно освободить? - PullRequest
19 голосов
/ 01 декабря 2008

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

NSString *foo = @"Bar";

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

Ответы [ 3 ]

17 голосов
/ 01 декабря 2008

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

15 голосов
/ 01 декабря 2008

Как упомянуто в документах

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

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

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

7 голосов
/ 17 декабря 2010

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

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

Примечание

NSString *str = [NSString string];

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

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

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

...