Следующее приложениеWillTerminate сохраняет состояние запущенных, остановленных, startTime и stopTime и делает недействительным таймер. Цель состоит в том, чтобы иметь возможность завершить приложение, а затем восстановить состояние и перезапустить таймер при перезагрузке приложения.NSTimer отключает симулятор iphone при втором запуске
//Save status to file on applicationWillTerminate.
- (void)applicationWillTerminate:(UIApplication *)application {
NSMutableArray *status = [[NSMutableArray alloc] init];
[status addObject:startTime];
[status addObject:stopTime];
[status addObject:[NSNumber numberWithInteger: started]];
[status addObject:[NSNumber numberWithInteger: stopped]];
[status writeToFile:[self statusFilePath] atomically:YES];
[status release];
if ([timer isValid]) {
[timer invalidate];
}
[lblTimer release];
[txtDescription release];
[lblDriverName release];
[startTime release];
[stopTime release];
// [timer release];
// timer = nil;
}
Следующая viewDidLoad восстанавливает состояние и должен перезапустить таймер, когда, если условие выполнено.
- (void)viewDidLoad {
// Re-direct applicationWillTerminate.
UIApplication *driverApp = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationWillTerminate:)
name:UIApplicationWillTerminateNotification
object:driverApp];
// Initialize status for first run, over-ride for saved status.
NSString *statusPath = [self statusFilePath];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:statusPath];
if (fileExists) {
// Over-ride for status saved.
NSArray *values = [[NSArray alloc] initWithContentsOfFile:statusPath];
startTime = [values objectAtIndex:0];
stopTime = [values objectAtIndex:1];
started = [[values objectAtIndex:2] intValue];
stopped = [[values objectAtIndex:3] intValue];
[values release];
}
else {
// For first run.
started = 0;
stopped = 0;
}
// Restart timer if previously still running.
if (started == 1 && stopped == 0) {
if (![timer isValid]) {
timer = [NSTimer scheduledTimerWithTimeInterval:0.25
target:self
selector:@selector(updateTimer)
userInfo:nil
repeats:YES];
}
}
[super viewDidLoad];
}
Программа работает нормально в симуляторе в первый раз. Во время второго запуска симулятора приложение падает, когда оно достигает таймера = [NSTimer ............. repeat: YES]; заявление. Я исследовал и пробовал множество вещей безрезультатно.
Любые советы были бы оценены.
вы инициализации таймера в любом месте? Если вы можете isValid на объекте nil, я думаю, это даст вам исключение? – lostInTransit
Другие части кода инициализируют и аннулируют таймер. Эти части кода будут работать должным образом столько раз, сколько вызывается. У меня нет проблемы до тех пор, пока я не нажму на кнопку симулятора дома, чтобы остановить приложение, а затем перезапустить, выбрав значок приложения на симуляторе. – user286662
Я бы добавил, что во втором запуске симулятор мгновенно отображает xib, а затем снова возвращается к экрану приложения iphone. – user286662