2011-12-29 2 views
0

일부 타이머를 사용하고 있으며 사용자가 완료되기 전에 취소하거나 종료 한 후보기에서 제거 할 수 있기를 바랍니다. 이 두 가지 모두 cancelAction 메서드로 처리해야합니다. 타이머가 끝나지 않은 경우, cancelAction의 if 문은 타이머에 무효화를 지시하고, 타이머를 무효로 만들고 남은 시간을 표시하는보기를 제거합니다. 이것은 완벽하게 작동합니다. 타이머가 이미 완료된 경우 cancelAction은 뷰를 제거하고 뷰를 무효화하려고 시도하지 않습니다. 그러나 이것은 효과가없는 것 같습니다. 작업이 끝나기 전에 취소하면 모든 것이 작동합니다. 작업이 끝난 후 취소하면 인스턴스에 보낸 인식 할 수없는 선택기를 예외로 설정합니다. 두 타이머 모두 scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: 메서드를 사용하여 만들었습니다.Cocoa : 무효화 할 때 NSTimer gdb

완료 전후의 호출의 차이점은 완료되면이 메서드가 실행된다는 것입니다.

- (void)timerFinished:(id)sender { 
[timer invalidate]; 
timer = nil; 
[timerLabelUpdater invalidate]; 
timerLabelUpdater = nil; 
} 

여기가 이상합니다. 그냥 [timerLaberUpdater invalidate]을 제거하면 메서드가 호출되고 제거됩니다. 그 타이머는 남은 시간을 카운트 다운하고 시간을 왼쪽으로 업데이트하기 때문에 그 라인을 제거하고 싶지 않습니다. 내가 무효화하지 않으면, 그것은 네거티브로 카운트 다운을 계속하고, 메모리를 차지합니다.

나는 그 라인을 제거하면 아무것도 변하지 않는다는 것을 알지 못한다. 두 타이머가 같은 방식으로 호출되었고, 다른 라인을 제거하더라도 여전히 작동하지 않는다.

나는 gdb에서 EXC BAD ACCESS를 얻었는데, 이는 선택기가 출시 된 인스턴스로 전송된다는 의미입니다.

도움 주셔서 감사합니다.

+0

타이머가 _ 자동 반복 _하지 않으면 _ 작업이 완료되면 즉시 무효화됩니다. 그 외에도, run 루프가이를 릴리즈 할 것이므로, 당신은 unsurpisingly'EXC_BAD_ACCESS'를 던지게되는 할당되지 않은 인스턴스로 끝날 수도 있습니다. – alediaferia

+0

이것은 정확히 내가 생각했던 것입니다. 어떻게 실행 루프에서 풀어 낼 수 있지만 인스턴스의 할당을 해제 할 수 있습니까? – Elbimio

+0

음, - [scheduledTimer ...] 메소드를 통해 타이머를 생성 할 때 타이머를 유지해야합니다. 그러면 무효화를 호출하면 자동 회수 풀에 의해 할당이 해제되지 않고 직접 해제 할 수 있습니다. 또는 인스턴스 초기화 메소드를 통해 타이머를 만들 수 있습니다. – alediaferia

답변

0
if([timerLabelUpdater isValid]) 
    [timerLabelUpdater invalidate];