19

При создании строки, используя следующие обозначения:Является ли буквальный NSString автореализованным или его нужно освободить?

NSString *foo = @"Bar"; 

ли нужно освободить один foo? Или foo автореализован в этом случае?

+0

Прошу прощения, добавьте ответ слишком поздно, но я думаю, вы должны проверить его на полноту, так как ответ Бена имеет в нем какую-то ошибку. –

ответ

17

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

+0

Я считаю, что освобождение foo приводит к сбою моей программы с «освобождением указателя» – bobobobo

+0

@bobobobo Я полностью согласен с вами. –

15

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

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

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

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

+0

Это полный ответ .... спасибо lotttt –

+0

Что-нибудь изменится после ARC? Я читаю строковые литералы, которые остаются в памяти и уничтожаются, когда программа перестает работать. Нужно ли создавать строки, используя alloc над литералами? –

6

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

«указатель освобождения не было выделено»

NOTE

NSString *str = [NSString string]; 

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

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

так release или autorelease не должен быть принят здесь.

 Смежные вопросы

  • Нет связанных вопросов^_^