EXC_BAD_ACCESS при переносе приложения iPhone с симулятора с 2.2 на 3.0
-
06-07-2019 - |
Вопрос
Ну, у меня было приложение, которое я разрабатывал в 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?