Objective-C, NSLocalizedString Случайный сбой
Я получаю странный сбой из-за NSLocalizedString. -[CFString retain]: сообщение отправлено освобожденному экземпляру 0x3c6ad0.
Я уверен, что это связано с NSLocalizedString, как когда я заменяю его статической строкой. все идет хорошо Вот строка, где я получил ошибку.
[_backButton setTitle:NSLocalizedString(sBackButtonDefaultTitle, nil) forState:UIControlStateNormal];
SBackButtonDefaultTitle имеет значение "Назад".
Что делает его случайным, так это то, что он иногда падает, а иногда нет.
РЕДАКТИРОВАТЬ:
SBackButtonDefaultTitle определяется в заголовочном файле
#define sBackButtonDefaultTitle @"Back"
Заголовок, конечно, импортируется в файл.m.
РЕДАКТИРОВАТЬ:
Подробнее... это название кнопки "Назад" используется во всем приложении. Практически в каждом контроллере. Однако сбой происходит только после нажатия определенного контроллера.
Этот контроллер содержит веб-представление. Если я нажму кнопку "Назад", контроллер появится. Без падений. Но если я нажимаю любой контроллер с той же кнопкой "Назад", приложение вылетает, выдавая ошибку, проиллюстрированную выше.
Это действительно таинственно. Я надеюсь, что кто-то может помочь мне исправить это.
3 ответа
Конечно, потому что ты sBackButtonDefaultTitle
был освобожден, когда вы звоните NSLocalizedString
,
Я предполагаю, что это автоматически выпущенная строка.
Вы можете проверить с включенным NSZombie, чтобы быть уверенным.
Возможно, вам придется сохранить sBackButtonDefaultTitle
строка, когда вы создаете ее, и отпускаете ее после NSLocalizedString
вызов.
Хорошей причиной использования NSLocalizedString является поддержка нескольких языков для вашего приложения. NSLocalizedString обычно хорошо сочетается с файлом строковых ресурсов, поэтому система может динамически выбирать язык, который она должна использовать для заполнения вашего пользовательского интерфейса. Я никогда не пытался использовать NSLocalizedString так, как вы, но я могу сказать, что использование файла строковых ресурсов определенно будет работать. Ознакомьтесь с Руководством Apple по интернационализации и файлом строковых ресурсов.
Надеюсь, поможет.
Это падение связано с sBackButtonDefaultTitle
быть выпущенным до этого момента в вашем коде. Убедитесь, что вы сохраняете его, когда вступаете во владение им, и что вы освобождаете его после использования в этой строке кода.