2010-03-05 113 views
1

以下applicationWillTerminate会保存启动,停止,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恢复状态,当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 .............重复:YES];声明。我已经研究并尝试了很多事情,但无济于事。

任何提示将不胜感激。

+0

你随时随地初始化计时器?如果你可以在一个无对象上有效,我想它会给你一个例外? – lostInTransit 2010-03-05 03:38:15

+0

代码的其他部分初始化并使计时器失效。这些代码部分可以在调用时多次正确运行。我没有问题,直到我按模拟器主页按钮终止应用程序,然后通过选择模拟器上的应用程序图标重新启动。 – user286662 2010-03-05 23:37:16

+0

我会补充说,在第二次运行模拟器瞬间显示xib然后闪回iphone应用程序屏幕。 – user286662 2010-03-05 23:42:52

回答

0
if (![timer isValid]) {

更改为:

if (nil == timer) {
+0

我绑定了你的建议,但我得到了同样的行为。我去了更远的一步,在applicationWillTerminate改变 如果(![定时器的isValid]){ 到 如果(!(零==定时器)){ ,仍然得到了同样的行为。 – user286662 2010-03-05 23:31:42

+0

更正。如果(![timer isValid])更改为 if(nil == timer) – user286662 2010-03-06 01:23:28

相关问题