2011-05-04 47 views
0

我有一個帶有UIView的XIB。 此UIView與UIView - Page1的自定義類關聯(在IB中)。 文件的所有者是MainMenuController(當然是UIViewController)。 當init控制器使用「initWithNibName」並將其添加到navController.viewControllers中時,我使用此XIB。當我使用「layoutSubviews」或「didMoveToSuperview」時,請勿調用「dealloc」方法

在Page1.m我寫:

- (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

感謝您的幫助! – 2011-05-04 11:24:38