EXC_BAD_ACCESS при переносе приложения iPhone с симулятора с 2.2 на 3.0

StackOverflow https://stackoverflow.com/questions/1016880

Вопрос

Ну, у меня было приложение, которое я разрабатывал в iPhone SDK 2.2, и я недавно собрал и запустил его в симуляторе 3.0. Базовый SDK по-прежнему установлен на 2,2. Я решил, что это позволит избежать проблем. Вместо этого я получаю

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000a1b1c1f3
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x92f4b688 objc_msgSend + 24
1   Foundation                      0x305085bd -[NSCFString isEqualToString:] + 61
2   HappyApp                        0x00002c27 -[CombinationsTableViewController loadData] + 220 (CombinationsTableViewController.m:64)

Сбой происходит в очень простой строке, где total является UITextField

if (![total.text isEqualToString:@""] ) {

Кто-нибудь сталкивался с этим? Я чувствую, что это проблема разногласий в потоке, или все мое приложение компилируется неправильно. Работает в симуляторе 2.2.1. Если оказывается, что это не способ тестирования приложения 2.2 в OS 3.0, то что мне следует делать, кроме переключения этого выпадающего списка?

Обновление . Эндрю Пулио был прав в том, что это была выпущенная ссылка. Отладчик указывал на одну строку, поэтому я получил неверные подсказки. Виновником была именно эта первая строка:

if(!([total.text isEqual:totalTextCache]
  && [divisions.text isEqual:divisionsTextCache])) {
  //Loads the data for the table only if the values were actually changed
  totalTextCache = total.text; //ditto for divisions
}

Эти строки используются только в totalTextCache , и он стал недействительным, если total.text был изменен. Это никогда не вызывало проблемы в sim 2.2.1, вероятно, потому что старый total.text никогда не был выпущен средой выполнения, когда он изменил значение. Но этот код был неверным. Я исправил это, изменив его, чтобы сделать именно то, что я думал, что isEqual делает:

if(!(total.text==totalTextCache && divisions.text==divisionsTextCache))

Потому что я на самом деле не хотел копировать NSString , а просто проверял, изменились ли они (и поэтому ссылка изменилась бы, это работает. Плохой код работал нормально в 2.2.1 во время выполнения, поскольку старая ссылка все еще может проверять свое свойство хеша и сравнивать с помощью isEqual .

Это было полезно?

Решение

Когда я установил свой 3.0 SDK, мои инструменты 2.0 исчезли, поэтому я не уверен, что это применимо, но я не думаю, что сборки симуляторов спроектированы так, чтобы быть двоичными, совместимыми с будущими средами выполнения.

Вполне вероятно, что проблема заключается в вашем коде. Если это так, я могу сказать, что у вас есть проблема с управлением памятью, а не «конфликт потоков». Все происходит в главном потоке в UIKit (не потокобезопасен).

Проверьте, где вы устанавливаете свою общую переменную; вероятно, он уже выпущен к тому времени, когда вы включите этот метод. Убедитесь, что ваш retainCount разумен.

Есть ли у вас такая же ошибка при сборке для 3.0?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top