Ну, у меня было приложение, которое я разрабатывал в 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
.