NSTimer вылетает симулятор iphone при втором запуске - PullRequest
1 голос
/ 05 марта 2010

Следующее applicationWillTerminate сохраняет состояние запущенного, остановленного, startTime и stopTime и делает недействительным таймер. Цель состоит в том, чтобы иметь возможность завершить работу приложения, затем восстановить состояние и перезапустить таймер при перезапуске приложения.

//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 восстанавливает состояние и должен перезапустить таймер при выполнении условия if.

- (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 ............. повторяется: ДА]; заявление. Я исследовал и попробовал множество вещей безрезультатно.

Любые советы будут оценены.

1 Ответ

0 голосов
/ 05 марта 2010
if (![timer isValid]) {

Изменить на:

if (nil == timer) {
...