2010-03-19 4 views
2

악기로 메모리 누수를 추적했습니다. 저는 항상 책임있는 도서관이 재단이라는 정보를 가지고 끝납니다. 내 코드에서 그를 추적 할 때, 나는 여기까지,하지만 잘못된 것은 내 메모리 관리와 함께 없다 :NSCFTimer 메모리 누수가 있습니까?

- (void)setupTimer { 
    // stop timer if still there 
    [self stopAnimationTimer]; 

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(step:) userInfo:nil repeats:YES]; 

    self.animationTimer = timer; // retain property, -release in -dealloc method 
} 

속성 animationTimer 타이머를 유지한다. -dealloc -Irelease it에서.

이제 프레임 워크 버그처럼 보입니까? iPhone OS 3.0 및 3.1에서 확인한 결과 NSTimer를 사용할 때마다이 문제가 발생했습니다. 그 밖의 무엇이 문제가 될지 모른다는 어떤 생각?

은 (스캔 간격은 0.1 초 내 메모리 누수이었다.하지만 오초와 같은 것)

+0

'stopAnimationTimer'의 기능은 무엇입니까? 난 당신이 타이머를 무효로해야한다고 생각하고 (당신이 당신의'stopAnimationTimer' 메쏘드에서 그것을하고 있기를 바란다). – bddckr

+0

예, 그냥 타이머를 무효화하고 속성을 nil로 설정합니다. – dontWatchMyProfile

답변

3

당신의 stopAnimationTimer 방법은 invalidate '보내고 및 release'보내고 (다음 nil로 설정)하여 animationTimer 속성을하지 않는 한 당신 ' 메모리 누수.

+0

당신은'dealloc' 대신에'release''ing을 의미합니다, 그렇죠? – bddckr

+0

... 죄송합니다. 예! :) –

5

-[NSTimer dealloc]으로 전화하지 마십시오. 이제까지.

이 경우 -scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:-invalidate으로 균형을 유지합니다. 타이머 개체에 -dealloc 또는 -release을 호출 할 필요가 없습니다.

+1

+1'invalidate'가 이후에 타이머를 '해제'한다면 +1해야합니다. 그는'self.animationTimer = timer; '를 사용하기 때문에 먼저 old를 해제하고 새로운 값을 유지하므로 누수가 없어야합니다. – bddckr

1

발견 : 내 타이머에 대한 강력한 참조가있었습니다. 실행 루프는 그것을 유지합니다. 그래서 RC는 2였습니다. 그러나 타이머가 목표에 대한 강력한 참조를 보유하기 때문에 (내 경우에는 타이머가 유지됨), 교착 상태에 빠졌습니다. -dealloc은 절대로 호출되지 않았기 때문에 내 타이머가 절대로 해제되지 않았습니다. WTF.

관련 문제