2010-03-05 5 views
1

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

Любые советы были бы оценены.

+0

вы инициализации таймера в любом месте? Если вы можете isValid на объекте nil, я думаю, это даст вам исключение? – lostInTransit

+0

Другие части кода инициализируют и аннулируют таймер. Эти части кода будут работать должным образом столько раз, сколько вызывается. У меня нет проблемы до тех пор, пока я не нажму на кнопку симулятора дома, чтобы остановить приложение, а затем перезапустить, выбрав значок приложения на симуляторе. – user286662

+0

Я бы добавил, что во втором запуске симулятор мгновенно отображает xib, а затем снова возвращается к экрану приложения iphone. – user286662

ответ

0
if (![timer isValid]) {

Изменить на:

if (nil == timer) {
+0

Я связал ваше предложение, но у меня такое же поведение. Я пошел еще дальше и в applicationWillTerminate изменил если (! [Таймер IsValid]) { к если (! (Ноль == таймер)) { и еще есть такое же поведение. – user286662

+0

Исправление. Изменен если (! [Таймер isValid]) до if (nil == таймер) – user286662