2011-03-02 2 views
4

Вопрос прост. Мне нужно выпустить NSLocalizedString? Например:Должен ли я освобождать NSLocalizedString?

NSString *internetMessageTitle = NSLocalizedString(
@"You are currently not connected to a internet network" 
@"Title of the message that tells the user there is no internet network"); 

Потому что я сделал это:

NSLog(@"Retain count of InternetMessageTitle is: %d", 
              [internetMessage retainCount]); 

Но он печатает сохранить кол 2. Тем не менее, я прочитал, что атрибут retainCount не очень надежен. Должен ли я отпустить его дважды?

И да, я прочитал правила управления памятью и руководство по документации, но я не вижу здесь никаких указаний NARC (NewAllocRetainCopy). Я все еще новичок, поэтому я действительно не знаю, как NSLocalizedString создает строки.

Спасибо!

EDIT1: Я использую эту переменную в UIAlertView. Я не знаю, увеличивается ли значение keepCount там, когда я его использую. И даже когда предупреждение не используется (внутри if, а если пропущено, то оно не используется). SaveCount по-прежнему 2 согласно NSLog.

ответ

8

Нет, вы не должны отпускать его. Если вы проверить, как NSLocalizedString определяется вы увидите:

#define NSLocalizedString(key, comment) \ 
     [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil] 

, что его обычно вызов метода NSBundle, что возвращает autoreleased строка

Я использую эту переменную в UIAlertView я не знаю если keepCount увеличивается, когда я его использую. И , даже если предупреждение не используется (внутри a if, а если if is is пропущено, то оно не используется). KeepCount по-прежнему 2 согласно NSLog.

Да, ярлыки в UIAlert сохраняют свои строки содержания, но вы не должны беспокоиться об этом - они освободят их, когда они будут уничтожены.

+0

Тогда почему saveCount 2? Или это только вводит в заблуждение? И почему он не падает, если я его отпущу? – Joze

+3

'keepCount' должен редко, если вообще когда-либо, использоваться для отладки. Если вы посмотрите на собственную документацию Apple, вы поймете, что это часто не очень полезно. – lxt

+0

Я предполагаю: 1 сохранить - для создания (будет обрабатываться пулом авторезистов), 2-й знак сохранения - по предупреждению - будет обрабатываться в деструкторе меток. Не уверен, почему вы не получаете аварии ... может быть, предупреждение не освобождается в то время - ваша программа может, вероятно, сбой позже, скажем, после того, как предупреждение закрыто (и поэтому вызван его метод dealloc) – Vladimir

1

Как вы говорите, нет NARC - так что вы уже знаете, что ответ отрицательный.

И что вы прочли о сохранении счета? Успокойся. Никогда не смотрите на счет сохранения как полезную информацию. Никогда не смотрите на все это.

И FFS не делают что-то безумное, как вызов release на объект несколько раз только потому, что вы считаете, что у него есть счет сохранения> 1. Этот материал абсолютно гарантированно повредит вам.

0

Cocoa memory management rules очень просты. Есть только одно из следствий: все вызовы alloc/new */* copy * должны быть уравновешены вызовом auto-release. Вы не вызываете метод или функцию с именем «alloc», начиная с «нового» или содержащего «копию», поэтому вы не должны выпускать.

Даже проще, чем следовать правилам памяти, использовать properties (объект или class), когда это возможно.

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