Есть несколько проблем с вашим кодом!
Плохая новость заключается в том, что ни один из них не имеет отношения к аварии, которую вы видите.
Первая и самая очевидная проблема
На самом деле, вы никогда не остановите свой обратный отсчет!
После того, как вы запланировали таймер в Start
, ваш timerLoop:
-метод будет вызываться каждую секунду. Но вы забыли проверить, стал ли totalSeconds
отрицательным ...
Вторая проблема
-(NSString *)timeFormatted:(int)newTotalSeconds
не будет работать так, как вы ожидаете! На самом деле, я чертовски уверен, что XCode выдает предупреждение компилятора о том, что «Локальное объявление 'newTotalSeconds' скрывает переменную экземпляра" .
Попробуйте: в Start
замените строку rocketCount.text = [self timeFormatted:newTotalSeconds];
на строку rocketCount.text = [self timeFormatted:42];
и установите точку останова после нее.
Третья проблема (на самом деле это пара проблем в одном месте)
Ваш dealloc
совершенно неверен:
Во-первых, не самая лучшая идея - звонить после [super dealloc]
. Во-вторых, «ты делаешь это неправильно»: учитывая твой Start
-метод, у тебя нет таймера, поэтому ты не должен release
. Вместо этого, если таймер все еще действителен, вам нужно его invalidate
. Но это даже не станет проблемой, потому что, пока запланировано rocketTimer
, ваш viewController не будет dealloc
ed (если у вас нет ошибки в вашем управлении памятью где-либо еще). Я написал довольно полный пример , объясняющий это поведение в предыдущем посте.
Итак, что вызвало аварию?
Честно:
Понятия не имею!
Чтобы выяснить, что именно пошло не так, попробуйте добавить точку останова к -[NSException raise]
. Кроме того, вы можете изменить функцию main
в main.m
следующим образом:
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int response;
@try {
response = UIApplicationMain(argc, argv, nil, nil);
} @catch (NSException *e) {
NSLog(@"%@: %@\nCall-stack:\n%@", [e name], [e reason], [e callStackSymbols]);
response = 1;
}
return response;
}
Это скажет вам, в каком методе ваша программа действительно потерпела крах.