Должен ли я сохранять NSString, когда он указывает на литерал?

62
2

    if (url_leng)
{
NSString *open_string;

if (g_system_status.language_code == 0)
open_string = @"Open";
else if (g_system_status.language_code == 1)
open_string = @"Abrir";
[open_string retain];
[alert addButtonWithTitle : open_string];
g_scan_result = targ_url;
}

Рассмотрим вышеупомянутый сегмент кода. Мой вопрос касается утверждения "сохранить". Как-то мне нужно выражение сохранения, чтобы заставить код работать. Мое единственное объяснение заключается в том, когда open_string выходит из области видимости, будет сделан отказ от него. И, таким образом, для сохранения значения необходим вызов сохранения.

Надеюсь, кто-нибудь может это подтвердить...

Также хотите спросить, нужны ли инструкции релиза для строк после условного блока?

Обновление: (Прочитав ваши добрые предложения и ценные идеи)

Попробовали следующую поправку:

    if (url_leng)
{
if (g_system_status.language_code == 0)
[alert addButtonWithTitle : @"Open"];
else if (g_system_status.language_code == 1)
[alert addButtonWithTitle : @"Abrir"];
else
[alert addButtonWithTitle : @"Open"];
g_scan_result = targ_url;
}

Кажется, теперь все в порядке (даже без заявления о сохранении).

спросил(а) 2021-01-25T13:03:45+03:00 5 месяцев назад
1
Решение
77

open_string - это указатель NSString указывающий на строковый литерал. Строковые литералы живут в стеке. В коде, где вы передаете ссылку на строковый литерал, скопируйте их в кучу, если вы хотите сохранить эти данные. Если вы владеете объектом (т.е. Называете keep/copy/new/alloc на объекте), вы несете ответственность за его выпуск, иначе вы будете утечки памяти.

ответил(а) 2021-01-25T13:03:45+03:00 5 месяцев назад
63

retain в этом коде определенно не требуется. Если у вас проблемы, его нет. Когда open_string назначается оповещению, вам больше не нужно. У вас должна быть проблема с управлением памятью в другом месте.

Возможно, проблема заключается в том, что language_code отличается от 0 и 1. В этом случае вы никогда не должны правильно инициализировать open_string. Вы должны хотя бы назначить nil или обработать этот другой случай.

Рассмотрите ARC и сделайте свою жизнь намного проще.

ответил(а) 2021-01-25T13:03:45+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема