@ "Какой-то текст" дает автореализацию или сохранение 1 объекта назад?

С учетом этого кода:

// Initialize string
NSString *name = @"Franzi";

@"" макрос создает NSString с заданным текстом (здесь имя Franzi) и RETAIN COUNT OF 1?

Итак, @"" дает NSString, который должен быть выпущен или нет? Я несу ответственность за этот объект? Второй пример кода меня смущает, хотя я использую его так:

NSSting *message;
message = [NSString stringWithFormat:@"Hello @%!",name];
//message = [NSString stringWithFormat:@"Hello Girl!"];

Таким образом, сообщение освобождается в следующем цикле запуска, k. Но что такое NSString, данный как аргумент для stringWithFormat?

Является ли объект класса NSString выпуском NSString @ "Hello% @" /@ "Hello Girl" в качестве аргумента? Или @"" - Konstruktor возвращает только autoreleased NSStrings?

Ответ 1

Литеральная нотация NSString @"" дает вам константные строки времени компиляции, которые находятся в их собственном пространстве памяти и имеют постоянные адреса.

Вопреки распространенному мнению, причина, по которой вы не выпускаете литеральные строки, заключается не в том, что они являются частью пула авторесурсов. Их нет - вместо этого они тратят всю жизнь приложения в том же пространстве памяти, которое они выделяют во время компиляции, и никогда не освобождаются во время выполнения. Они удаляются только при окончании процесса приложения.

Тем не менее, единственный раз, когда вам нужно управлять памятью постоянным NSString, является то, когда вы сохраняете или копируете их для себя. В этом случае вы должны освободить ваши сохраненные или скопированные указатели, как и любой другой объект.

Другое дело: это сами литералы, которым не требуется управление памятью. Но если вы передадите их в качестве аргументов в методах или инициализаторах NSString, например, с помощью stringWithFormat:, тогда это те объекты, которые возвращаются методами и инициализаторами, которые обычно соблюдают все правила управления памятью.