2010-09-12 110 views
2

我试图从我的应用程序委托中运行一个方法,该方法将对象保存在其他类中,以及使计时器无效。我设置了它,以便当我的应用程序退出时,它会在我的课程中运行该方法并保存并停止计时器。iPhone:从应用程序委托崩溃导致NSTimer无效应用程序

在应用程序的委托:

- (void)applicationWillResignActive:(UIApplication *)application { 

    // Save the mission because they are leaving the app 
    if ([timeRun hasScore]) { 
     [timeRun resetWithSave]; 
    } 

} 

它在 “timeRun” 类调用的方法:

- (void)resetWithSave { 
    // Save 
    self.counterInt = 150; 
    self.timer.text = [self timeInSeconds:counterInt]; 
    [start setBackgroundImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal]; 
    self.started = NO; 
    self.score.text = @"0"; 
    [self saveMission]; 
    if ([countTimer isValid]) { 
     [countTimer invalidate]; 
    } 
    [table scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO]; 
} 

但是,我越来越崩溃:

2010-09-11 19:35:21.503 Score Card[2747:307] -[__NSCFType isValid]: unrecognized selector sent to instance 0x19e190 
2010-09-11 19:35:21.594 Score Card[2747:307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType isValid]: unrecognized selector sent to instance 0x19e190' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x30897ed3 __exceptionPreprocess + 114 
    1 libobjc.A.dylib      0x3002f811 objc_exception_throw + 24 
    2 CoreFoundation      0x30899683 -[NSObject(NSObject) doesNotRecognizeSelector:] + 102 
    3 CoreFoundation      0x308411d9 ___forwarding___ + 508 
    4 CoreFoundation      0x30840f90 _CF_forwarding_prep_0 + 48 
    5 Score Card       0x00006b3d -[TimeRun resetWithSave] + 272 
    6 Score Card       0x00002b39 -[Score_CardAppDelegate applicationWillResignActive:] + 80 
    7 UIKit        0x31ea6879 -[UIApplication _setActivated:] + 212 
    8 UIKit        0x31eda4ab -[UIApplication _handleApplicationSuspend:eventInfo:] + 238 
    9 UIKit        0x31eab301 -[UIApplication handleEvent:withNewEvent:] + 2200 
    10 UIKit        0x31eaa901 -[UIApplication sendEvent:] + 44 
    11 UIKit        0x31eaa337 _UIApplicationHandleEvent + 5110 
    12 GraphicsServices     0x31e4504b PurpleEventCallback + 666 
    13 CoreFoundation      0x3082cce3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 26 
    14 CoreFoundation      0x3082cca7 __CFRunLoopDoSource1 + 166 
    15 CoreFoundation      0x3081f56d __CFRunLoopRun + 520 
    16 CoreFoundation      0x3081f277 CFRunLoopRunSpecific + 230 
    17 CoreFoundation      0x3081f17f CFRunLoopRunInMode + 58 
    18 GraphicsServices     0x31e445f3 GSEventRunModal + 114 
    19 GraphicsServices     0x31e4469f GSEventRun + 62 
    20 UIKit        0x31e51123 -[UIApplication _run] + 402 
    21 UIKit        0x31e4f12f UIApplicationMain + 670 
    22 Score Card       0x000029ef main + 70 
    23 Score Card       0x000029a4 start + 40 
) 
terminate called after throwing an instance of 'NSException' 
Program received signal: “SIGABRT”. 
kill 
quit 

为什么会这样撞我的应用程序?

+0

向我们展示'countTimer'的定义 – jer 2010-09-12 03:08:03

回答

0

它看起来像计时器从未初始化或它被释放。有时像这样的异常也会在随机对象抛出时抛出。检查你的指针并保持计数!

5

在一种预感,你做这样的事情

countTimer = [NSTimer scheduledTimerWithTarget:...]; 

... 

if ([countTimer isValid]) 
{ 
    [countTimer invalidate]; 
} 

... 


if ([countTimer isValid]) 
{ 
    [countTimer invalidate]; 
} 

A“计划的”计时器被添加到您的运行循环。然后由运行循环保留。使它失效将其从运行循环中删除,因此它被释放。如果没有其他任何东西保留它,它是交易。当您尝试再次使用它时,它会崩溃。

尝试像[countTimer invalidate]; countTimer = nil;

或者,你可以保留的计时器,但要注意,计时器保留其目标,因此很容易与保留周期结束。

+0

Yah。由于您没有保留定时器(因为您通常不应该这样做),所以您不知道它何时会被释放,除非它将在调用回调方法之后。您应该在当时将其参考设置为零,或者在您使其无效时,因为它会在那之后自动释放。 – 2010-09-12 03:38:22

+1

你知道它何时被运行循环*释放*。你不知道什么时候会被处理;那不一样。 – 2010-09-12 13:02:49