2012-05-04 3 views
0

다음과 같은 방법으로 충돌이 발생합니다. UI는 NSTimer의 시작/정지 기능을 처리하는 버튼과 같습니다. 타이머가 실행되면 UILabel이 업데이트됩니다. viewDidLoad 메서드를 사용하면 타이머가 작동하고 멈추게되지만 다시 시작하면 응용 프로그램이 중단됩니다.NSTimer가 충돌을 일으킴

viewDidLoad 메서드에서 alloc을 제거하고 시작 버튼을 사용하려고하면 즉시이 발생합니다. NSLog(@"Start now");조차도 호출되지 않습니다.

코드 : 나는 모든 [NSTimer fire]를 호출 할 필요가 표시되지 않습니다

- (void)tick { 
NSLog(@"tick"); 
float value = [moneyLabel.text floatValue]; 
moneyLabel.text = [NSString stringWithFormat:@"%f", value + 1.0]; 

} 

- (IBAction)startStopButtonClicked:(UIButton *)sender { 
if ([sender.titleLabel.text isEqualToString:@"Start"]) { 
    NSLog(@"Start now"); 
    if (timer) { 
     NSLog(@"Timer valid"); 
     [timer fire]; 
    } else { 
     NSLog(@"Timer is nil"); 
     timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(tick) userInfo:nil repeats:YES]; 
     [timer fire]; 
    } 

    NSLog(@"bla"); 

    [sender setTitle:@"Stop" forState:UIControlStateNormal]; 
} else { 
    [timer invalidate]; 
    timer = nil; 
    NSLog(@"Stopped."); 
    NSLog(@"Timer isValid: %@", timer); 
    [sender setTitle:@"Start" forState:UIControlStateNormal]; 
} 
} 
+1

충돌 로그를 게시하십시오. – Devang

+0

예 plz 우리가 당신을 도울 수 있도록 귀하의 충돌 로그를 게시하십시오 ... – sandy

+0

*** 캐치되지 않은 예외 'NSInvalidArgumentException'으로 인한 종료 응용 프로그램, 이유 : '- [__ NSCFArray startStopButtonClicked :] : 인스턴스 0x683d8e0에 전송 된 인식 할 수없는 선택자' – DAS

답변

0

코드 당신이 게시 한 작품 - 그냥 테스트 새 프로젝트에서 문제가 다른 곳에있을 수 있습니다. 나는 viewDidLoad: 또는 지정된 이니셜 라이저로 어떤 초기화도하지 않고 iv34를 선언함으로써 만 테스트했습니다 ...

+1

문제는 AppDelegate에 rootViewController를 추가하지 못했습니다. WTF. – DAS

3

; 타이머가 발사시기를 결정하는 데 충분해야합니다. 명시 적으로 해치지 않을 것입니다 - (id)initnil로 설정하지만

첫째, timer은 (는 객체의 인스턴스 변수가 있다면 그것이 있어야) nil 있는지 확인합니다.

다음으로 시작/정지 버튼에없는 텍스트가 눌 렸는지 여부를 결정하는 타이머 자체의 상태를 사용합니다 : 원하는대로

- (IBAction)startStopButtonClicked:(UIButton *)sender 
{ 
    if (timer != nil) 
    { 
     NSLog(@"Stopping timer"); 
     [timer invalidate]; 
     timer = nil; 
    } 
    else 
    { 
     NSLog(@"Starting timer"); 
     timer = [NSTimer scheduledTimerWithTimeInterval:1 
               target:self 
               selector:@selector(tick) 
               userInfo:nil 
               repeats:YES]; 
    } 

    [sender setTitle:(timer != nil ? @"Stop" : @"Start") 
      forState:UIControlStateNormal]; 
} 
+0

** * 캐치되지 않은 예외 'NSInvalidArgumentException'으로 인해 응용 프로그램 종료 - '- [__ NSCFArray startStopButtonClicked :] : 인스턴스 0x683d8e0에 전송 된 인식 할 수없는 선택기' – DAS

+0

@Darwin 게시 한 코드 외부의 충돌처럼 보입니다. 주어진 또 다른 대답은이 코드가 작동한다는 것을 나타내는 것으로 보이며, 잘못된 위치에서 찾고있는 것처럼 보입니다. – trojanfoe

+0

내 프로젝트에는 이것을 제외하고 코드가 없습니다 ... 다른 모든 것은 viewDidLoad와 같은 표준입니다. 무슨 엉망 이냐 ... – DAS

관련 문제