2011-03-02 96 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如何創建字符串。

謝謝!編輯1:我在UIAlertView中使用這個變量我不知道當我使用它時,retainCount是否增加。即使不使用警報(在if內部,並且如果忽略它,它也不會被使用),根據NSLog,retainCount仍然是2。

回答

8

不,你不能釋放它。如果檢查NSLocalizedString是如何定義的,你會看到:

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

那其常以一個NSBundle的方法的調用返回自動釋放的字符串

我使用這個變量在UIAlertView中 我不知道如果在我使用它時增加了retainCount爲 。並且 即使未使用警報 (在if中,如果if爲 ,則跳過它不使用),根據NSLog,retainCount 仍然爲2。

是的,UIAlert中的標籤會保留它們的內容字符串,但是您不應該擔心 - 它們會在被銷燬時釋放它們。

+0

那麼爲什麼是retainCount 2?或者它只是誤導?如果我釋放它,爲什麼它不會崩潰? – Joze 2011-03-02 08:52:38

+3

'retainCount'應該很少用於調試。如果你看看Apple自己的文檔,你會發現它通常不是很有用。 – lxt 2011-03-02 08:56:28

+0

我猜:1保留 - 用於創建(將由autorelease池處理),第二個保留 - 通過警報標籤 - 將在標籤析構函數中處理。不知道爲什麼你不會崩潰...可能警覺不會在那個時候被釋放 - 你的程序可能會在稍後崩潰,比如在警報關閉後(如此調用dealloc方法) – Vladimir 2011-03-02 08:57:07

1

正如你所說,沒有NARC - 所以你已經知道答案是否定的。

你讀過關於保留數的內容嗎?注意它。永遠不要將保留計數看作有用的信息。 永遠不要看這一切。

而FFS不會做一些瘋狂的事情,比如在一個對象上多次調用release,因爲你認爲它的保留次數> 1。這些東西絕對保證會讓你感到困惑。

0

Cocoa memory management rules非常簡單。結果只有一個:所有的alloc/new */* copy *調用必須通過調用自動/釋放來平衡。你沒有調用名爲「alloc」的方法或函數,以「new」開頭或包含「copy」,因此你不應該發佈。

即使比以下內存規則更簡單的是在可能的情況下使用properties(object或class)。

相關問題