2011-05-03 4 views
0

내 코드 :NSTimer 화재 문제 (없는 일반적인 무효화 문제) 아래

- (void) restart { 
    [ self pause ]; 
    //init something here... 
    [ self proceed ]; 
} 

- (void) pause { 
    if ([ _timer isValid ]) { 
     [ _timer invalidate ]; 
     _timer = nil; 
    } 
} 

- (void) proceed { 
    _timer = [ NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector (fireHandler) userInfo: nil repeats: YES ]; 
} 

대부분 잘 작동하지만이 방법은 "다시 시작"호출 후 나는 어떤 경우에 발견 한 번 이상 때때로 fireHandler는 단일 timeInterval 내에서 두 번 이상 호출되었거나 timeInterval이 더 짧아졌습니다. 어쨌든 갑자기 더 빠르게 실행됩니다.

< _ NSCFTimer :

는 지금, 나는 다음과 같이 뭔가 발견 fireHandler에 보낸 사람을 추가하고, 메모리 주소를 확인 NSLog를 사용 0x4e610a0을> < _NSCFTimer : 0x4e610a0> < _ NSCFTimer : 0x4e610a0> < _NSCFTimer : 0x4e610a0> < _ NSCFTimer : 0x4e610a0> < _NSCFTimer : 0x4e610a0>

... 반복 ... 항상 동일한 타이머임을 나타냅니다. 하지만 가끔은 내가 "다시 시작"을 호출 할 때 다시는

<을 나타냅니다 _ NSCFTimer : 0x4e3d740> < _NSCFTimer : 0x4e610a0> < _ NSCFTimer : 0x4e3d740> < _NSCFTimer : 0x4e610a0> < _ NSCFTimer : 0x4e3d740> < _NSCFTimer : 0x4e610a0> ... 그것은 두이 거기 의미

반복

imer, 그것은 첫 번째가 무효화되어 출시되지 않은 것으로 보입니다. 그것은 동시에 두 번째 것과 동시에 실행되고, 몇 초 후에, 두 번째 것이 제거 된 후에도 첫 번째 것은 아직 살아 있습니다.

잠시 후 다시 나타납니다. 이러한 상황은 규칙이 없어도 전체 시간의 약 30 %가 발생합니다. 나는 이것에 대해 전혀 몰랐다. 누군가가 내게 정확히 어떤 문제를 일으킬 수있는 아이디어를 줄 수 있다면, 적어도.

+0

매번 같은 스레드에서 'restart'를 호출해야합니다. –

답변

1

[NSTimer scheduledTimerWithTimeInterval]은 전화 할 때마다 새 타이머를 만들고 예약합니다. 따라서 proceed 번을 여러 번 호출하면 매번 새로운 타이머가 생성되어 시작되어 _timer 참조를 무시하고 누출이 발생합니다.

설명하는 동작을 얻는 이유를 말할 수는 없지만 실수로 proceed 번을 호출하는 것이 원인 일 수 있습니다. 대신 다음과 같이 다시 작성하고 도움이되는지 확인하십시오.

- (void)proceed 
{ 
    [_timer invalidate]; 
    _timer = [NSTimer schedule...]; 
} 
+0

답장을 보내 주셔서 감사합니다.이 경우, 대신 "재시작"을 호출 할 때마다 "진행"이라고 직접 부르지 않습니다. 따라서 메서드 "pause"를 사용하여 무효화를 이미 처리합니다.지금, 나는 다음과 같이 뭔가를 발견 fireHandler에 보낸 사람을 추가하고, 메모리 주소를 확인 NSLog를 사용 –

+0

<__ NSCFTimer : 0x4e610a0> <__ NSCFTimer : 0x4e610a0> <__ NSCFTimer : 0x4e610a0> <__ NSCFTimer : 0x4e610a0> < __NSCFTimer : 0x4e610a0> <__ NSCFTimer : 0x4e610a0> 반복 ... 항상 동일한 타이머임을 나타냅니다. –

+0

하지만 가끔은 내가 다시 "다시 시작"<__ NSCFTimer : 0x4e3d740> 호출 할 때 <__ NSCFTimer : 0x4e610a0> <__ NSCFTimer : 0x4e3d740> <__ NSCFTimer : 0x4e610a0> <__ NSCFTimer : 0x4e3d740> <__ NSCFTimer : 0x4e610a0> ... 그것을 타이머가 두 개 있다는 것을 의미합니다. 첫 번째 타이머가 무효화되고 해제되지 않은 것으로 보입니다. 그리고 동시에 두 번째와 함께 실행하고, 잠시 후, 그것은 disapper ... –