EXC_BAD_ACCESS при переносе приложения iPhone с симулятора с 2.2 на 3.0 - PullRequest
0 голосов
/ 19 июня 2009

Ну, у меня было приложение, которое я разрабатывал в 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 был изменен. Это никогда не вызывало проблемы в симе 2.2.1, вероятно, потому что старый total.text никогда не был выпущен средой выполнения, когда он изменил значение. Но этот код был неверным. Я исправил это, изменив его так, чтобы он точно делал то, что, по моему мнению, делал Equal:

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

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

1 Ответ

1 голос
/ 19 июня 2009

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

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

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

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

...