При создании строки, используя следующие обозначения:Является ли буквальный NSString автореализованным или его нужно освободить?
NSString *foo = @"Bar";
ли нужно освободить один foo
? Или foo
автореализован в этом случае?
При создании строки, используя следующие обозначения:Является ли буквальный NSString автореализованным или его нужно освободить?
NSString *foo = @"Bar";
ли нужно освободить один foo
? Или foo
автореализован в этом случае?
Компилятор выделенных строк (формата @ "STRING") является постоянным, а сообщения -retain, -release и -autorelease игнорируются. В этом случае вам не нужно выпускать или автообновлять foo (но это не повредит).
Я считаю, что освобождение foo приводит к сбою моей программы с «освобождением указателя» – bobobobo
@bobobobo Я полностью согласен с вами. –
Как упомянуто в документации
вы берете право собственности на объект, если вы создать его, используя метод, имя которого начинается с «Alloc» или «новый» или содержит « копировать "(например, alloc, newObject или mutableCopy), или если вы пришлите ему сообщение о сохранении. Вы являетесь , ответственным за освобождение собственности на принадлежащие вам объекты, используя выпуск или автореферат. В любое другое время вы получаете объект, вы не должны освободить его.
Поскольку вы не используете alloc, copy и т. Д., Вам не нужно беспокоиться о выпуске объекта.
Это полный ответ .... спасибо lotttt –
Что-нибудь изменится после ARC? Я читаю строковые литералы, которые остаются в памяти и уничтожаются, когда программа перестает работать. Нужно ли создавать строки, используя alloc над литералами? –
Я согласен с @Ben \ Gottlieb на «Компилятор выделил строки (в формате @» STRING «) являются постоянными», а как вы не инициализируетесь их через передавая сообщение alloc
или retain
, вы не должны пройти release
или autorelease
сообщение им в противном случае ваше приложение будет врезаться со следующей журнал
«указатель освобождения не было выделено»
NSString *str = [NSString string];
эквивалентно:
NSString *str = [[[NSString alloc] init] autorelease];
так release
или autorelease
не должен быть принят здесь.
Прошу прощения, добавьте ответ слишком поздно, но я думаю, вы должны проверить его на полноту, так как ответ Бена имеет в нем какую-то ошибку. –