2011-10-07 4 views
0

그래서 NIPimer가있는 UIPopover가 있습니다. 다른 방법을 만들기 위해 다양한 BOOLS 및 속성이 있지만 지금은 중요하지 않습니다. 내가 알고 싶은 것은, popover의 부모 뷰가 사라졌을 때 타이머를 해제하고 무효화 할 수있는 방법이 있습니까? 무효화하고 타이머를 해제하는 클래스 메서드를 시도했지만 그들은 SIGABRT 및 EXC_BAD_ACCESS 경고를 주었다. 나는 타이머가 이미 무효 였을 때 dealloc에게 말하도록하는 것과 관련이 있다고 생각한다.UIPopover에서 NSTimer 중지

몇 가지 추가 요인 : 1. 타이머는 유효 기간을 유지해야하며 popover가 해제 될 때 할당됩니다. 2. 부모보기가 사라지면 타이머가 무효화되고 해제되어야합니다.

제안 사항?

CODE :

//@interface 
    NSTimer *clickTimer; 
@property (nonatomic, retain) NSTimer *clickTimer; 

//.m 
- (IBAction)clickerPressed:(id)sender 
{ 
if ([click isClicking] == YES) { 
    [clickTimer invalidate]; 
    [clickTimer release]; 
    clickTimer = nil; 
    // enable the idle timer when the clicking is turned off 
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; 
    [click setIsClicking:NO]; 
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal]; 
    [clickerButton setTitle:@"Start" forState:UIControlStateNormal]; 
    [clickStatus setText:[NSString stringWithFormat:@"%d",[click numberOfBeatsToDisplay]]]; 
    [click setClickCount:0]; 

} 
else { 
    // disable the idle timer while the metronome is clicking. 
    [[UIApplication sharedApplication] setIdleTimerDisabled:YES]; 
    [click setIsClicking:YES]; 
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal]; 
    [clickerButton setTitle:@"Stop" forState:UIControlStateNormal]; 
    [[NSThread currentThread] setThreadPriority:1.0]; 

    clickTimer = [[NSTimer scheduledTimerWithTimeInterval:[click clickRateInSeconds] target:self selector:@selector(click:) userInfo:nil repeats:YES]retain]; 
    } 

}

+1

항상, dealloc 외부의 변수를 해제 할 때는 항상 nil로 설정하십시오. '[clickTimer release]; clickTimer = nil;' – Joe

+0

편집 됨, 죄송합니다. CodaFi

답변

2

자동으로 포인터에 nil을 할당하지 않는 개체를 해제. 해제 진술 후 clickTimer = nil;을 추가하십시오. 이렇게하면 clickTimer을 해제하려고 시도 할 때 다른 방법이 잘못된 개체에 액세스하는 것을 방지 할 수 있습니다.

- (void) invalidateClickTimer 
{ 
    // invalidate timer 
    if (clickTimer == nil) 
     return; 
    [clickTimer invalidate]; 
    [clickTimer release]; 
    clickTimer = nil; 

    // stop clicking 
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; 
    [click setIsClicking:NO]; 
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal]; 
    [clickerButton setTitle:@"Start" forState:UIControlStateNormal]; 
    [clickStatus setText:[NSString stringWithFormat:@"%d",[click numberOfBeatsToDisplay]]]; 
    [click setClickCount:0]; 
    return; 
} 

:

당신은 당신을위한 타이머를 무효화하는 방법을 만들기보다는 각각의 방법은 타이머를 무효화 가진 고려해 볼 수 있습니다, 당신의 모든 메소드가 제대로 전무clickTimer를 설정했는지 확인하려면 그런 다음이 줄 - (IBAction)clickerPressed:(id)sender

if ([click isClicking] == YES) { 
    [clickTimer invalidate]; 
    [clickTimer release]; 
    clickTimer = nil; 
    // enable the idle timer when the clicking is turned off 
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; 
    [click setIsClicking:NO]; 
    [clickerButton setBackgroundImage:[UIImage imageNamed:@"wood.png"] forState:UIControlStateNormal]; 
    [clickerButton setTitle:@"Start" forState:UIControlStateNormal]; 
    [clickStatus setText:[NSString stringWithFormat:@"%d",[click numberOfBeatsToDisplay]]]; 
    [click setClickCount:0]; 
} 

에 다음 줄을 교체 :

를3210
if ([click isClicking] == YES) { 
    [self invalidateClickTimer]; 
} 

부모보기의 UIViewController에서 새 방법 - (void) invalidateClickTimer을 호출하십시오. 아마도이 메소드에서 - (void)viewWillDisappear:(BOOL)animated

+0

감사합니다. 지금 사용해 보겠습니다. – CodaFi

+0

아니요, 주사위가 없습니다. 귀하의 방법으로 타이머가 무효화되고 무효화되지만 클릭이 중지되지 않습니다. – CodaFi

+0

클릭을 멈추지 않는 것은 무엇입니까? –