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 быть выпущенным до этого момента в вашем коде. Убедитесь, что вы сохраняете его, когда вступаете во владение им, и что вы освобождаете его после использования в этой строке кода.

Другие вопросы по тегам