2012-04-30 96 views
0

由於NSLocalizedString,我得到一個奇怪的崩潰。 - [CFString retain]:發送到釋放實例0x3c6ad0的消息。Objective-C,NSLocalizedString隨機崩潰

我相信這是由於NSLocalizedString,因爲當我用靜態字符串替換它。一切都很好。這是我得到錯誤的那一行。

[_backButton setTitle:NSLocalizedString(sBackButtonDefaultTitle, nil) forState:UIControlStateNormal]; 

sBackButtonDefaultTitle是「Back」。

是什麼讓它隨機是有時崩潰,有時不崩潰。

編輯:

的sBackButtonDefaultTitle是在頭文件

#define sBackButtonDefaultTitle @"Back" 

標題是限定,當然,導入到.m文件。

編輯:

更多細節......這回按鈕標題使用的應用範圍。幾乎在每個控制器中。但是,只有在推動某個控制器後纔會發生崩潰。

此控制器包含Web視圖。如果我點擊「後退」按鈕,控制器就會停止。沒有崩潰。但是,如果我用相同的「後退」按鈕推動任何控制器,應用程序崩潰,給出我上面所示的錯誤。

這真的很神祕。我希望有人能幫我修復它。

回答

0

此崩潰是由於sBackButtonDefaultTitle在您的代碼中的該點之前發佈。請檢查以確保您在佔有它時保留它,並且在之後使用該代碼行來釋放它

+0

它是一個在定義中定義的字符串,不是被分配的對象。 –

+0

@ShatouDev請編輯您的問題以顯示字符串的定義位置和方式。 –

1

當然,因爲你sBackButtonDefaultTitle已被釋放,當你撥打NSLocalizedString

我想這是一個自動發佈的字符串。

你可能想檢查NSZombie啓用,當然。

創建該字符串時,您可能需要保留sBackButtonDefaultTitle字符串,並在撥打NSLocalizedString後將其釋放。

+0

sBackButtonDefaultTitle在定義文件中定義。 –

+0

顯示«定義文件»。 – Macmade

+0

#define sBackButtonDefaultTitle @「Back」 –

0

使用NSLocalizedString的一個很好的理由是爲您的應用程序支持多種語言。 NSLocalizedString通常適合字符串資源文件,以便系統可以動態地決定它應該用來填充UI的語言。我從來沒有嘗試過使用NSLocalizedString,但我可以告訴你使用字符串資源文件肯定會起作用。看看Apple's Guidelines for Internationalizationstring resource file

希望它有幫助。

+0

我已經使用了一個字符串文件。但是在某些時候,iOS似乎找不到sBackButtonDefaultTitle的本地化字符串。 –

+0

你的意思是iOS可以從字符串文件中找到其他字符串,但不能找到sBackButtonDefaultTitle?我從未見過這種情況。如果所有字符串都不能被識別,那麼你的字符串文件沒有被正確創建。所以你需要遵循蘋果提供的例子,並從命令行工具生成文件。 –

+0

這就是讓我發瘋的原因!我真的不知道爲什麼會發生這種情況! –