2011-05-04 2 views
0

UIView가있는 XIB가 있습니다. 이 UIView는 (IB에서) UIView - Page1의 사용자 지정 클래스와 연결됩니다. File의 소유자는 MainMenuController입니다 (UIViewController, 물론). "initWithNibName"으로 init 컨트롤러를 만들 때이 XIB를 사용하고 navController.viewControllers에 추가합니다. Page1.m에서"layoutSubviews"또는 "didMoveToSuperview"를 사용할 때 "dealloc"메서드를 호출하지 마십시오

내가 쓰기 :

- (void)didMoveToSuperview 
{ 
    NSLog(@"Page 1 did move to superview"); 
    mainTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(refreshDateAndTime) userInfo:nil repeats:YES]; 
} 

-(void) refreshDateAndTime { 
    NSLog(@"second"); 
} 

- (void)dealloc 
{ 
    NSLog(@"Page1 dealloc called"); 
    [mainTimer invalidate]; 
    mainTimer = nil; 
    [mainTimer release]; 
    [super dealloc]; 
} 

가이 코드에 의해 타이머 "mainTimer"를 시작하면 방법 "의 dealloc은"호출되지 및 개체가 실행되고 메모리와 타이머에서 언로드되지 않습니다. "didMoveToSuperview"블록에서 dealloc이라는 줄을 주석 처리하면 모두 괜찮습니다. 왜?

답변

0

Dealloc은 개체에 보존 기간이없는 경우 (즉, 최종 출시 이후)에만 호출됩니다.

타이머를 만들 때 대상이 self임을 알리는 것입니다. (즉, 가진 self 메모리에서 해제하고 타이머가 여전히,이 때문에 self을 활성 유지합니다. 타이머가 자신의 목표을 유지합니다.

이 추가 사람이보기에 유지가 의미 나중에 합병증을 방지하기 위해, 이는 dealloc이 호출되지 않음을 의미합니다 (타이머에 의해 계속 유지됨).

기본적으로 dealloc을 사용하여 타이머를 무효화하십시오. 다른 것을 사용하십시오 (타이머가 더 이상 필요하지 않을 때 트리거되는 메소드 일 수 있음).)

+0

도움을 주셔서 감사합니다! –

관련 문제