2011-03-03 9 views
1

NSTimer를 무효로하는 이상한 문제가 있습니다. 사용자가 특정 화면에있는 한 지속적으로 업데이트해야합니다. NSTimer를 사용하여이를 수행합니다. viewDidLoad 메서드에서 아래 코드를 작성했습니다.뷰 수명주기에서 NSTimer를 무효화 할 위치는 어디입니까?

- (void)viewDidLoad { 
self.pollServerForUpdates = [NSTimer scheduledTimerWithTimeInterval:2.0 
target:self 
selector:@selector(fetchNewDataFromServer:) 
userInfo:nil 
repeats:YES]; 
} 

타이머를 무효화하려고하면 문제가 발생합니다. 사용자가 화면을 떠날 때 앱이 서버를 폴링하지 않게하려면 viewWillDisappear 메서드에 타이머 무효화 코드를 삽입합니다.

-(void) viewWillDisappear:(BOOL)animated{ 
[super viewWillDisappear:YES]; 
//NSLog(@"%d",[self.view retainCount]); 
[self.pollServerForUpdates invalidate]; 
self.pollServerForUpdates = nil; 
} 

내 메인보기와 폴링보기간에 앞뒤로 가기 위해 내비게이션 컨트롤러를 사용합니다. 기본보기와 폴링보기 사이를 빠르게 이동하면 앱이 다운됩니다. 나는 일이 뭐죠 볼 수 NSZombie을 활성화하고 이것이 내가 내 응용 프로그램이 잘 작동 타이머 무효화를 제거하면 내가

*** -[CALayer retainCount]: message sent to deallocated instance 0x1c3be0 

을 얻을 것입니다. 하지만 사용자가 화면을 떠나 자마자 폴링 (타이머)을 중지하고 싶습니다.

보기가 해제되기 전에 타이머가 분할 된 것이므로이 문제가 발생한다고 생각합니다. 어떻게 피합니까? 디자인을 변경해야합니까? 어떤 도움을 주시면 감사하겠습니다.

p.s :이 화면에서 푸시 알림을 사용할 수 없습니다.

+0

이 토피는 당신을 도울 수 있습니다 : http://stackoverflow.com/questions/1031554/nstimer-doesnt-stop – malinois

답변

1

버그가 다른 곳에서있을 수 있으며, 다른 클래스가 참조를 보유하지 않고 뷰를 사용하고있을 수 있습니다. 타이머를 무효화하지 않으면 뷰에 대한 참조가 영원히 남아 있으므로 잠재적으로 수명이 연장되고 코드의 다른 곳에서 메모리 관리 버그를 마스킹 할 수 있습니다.

예외를 위반하면 좀비 호출이 어디에서 발생하는지보십시오.

+0

실마리를위한 모건 고마워요, 예 코드의 어딘가에 다른 버그였습니다. 나는 tableview를 두 번 풀어 놓았고 충돌을 일으킨 것이 무엇인지. 입력을 감사하십시오. –

관련 문제