2011-05-04 43 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