使用“layoutSubviews”或“didMoveToSuperview”时不要调用“dealloc”方法

时间:2011-05-04 10:43:46

标签: iphone objective-c dealloc

我有一个带UIView的XIB。 这个UIView与自定义类UIView(Page1)相关联(在IB中)。 File的所有者是MainMenuController(当然是UIViewController)。 我在使用“initWithNibName”的init控制器时使用此XIB,并将其添加到navController.viewControllers中。

在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调用,那么一切正常。 为什么呢?

1 个答案:

答案 0 :(得分:0)

Dealloc仅在您的对象没有剩余时(即最终发布后)被调用。

创建计时器时,您告诉它目标是self。为避免以后出现并发症(即,self从内存中释放并且计时器仍处于活动状态,因此它会保留self 计时器将保留其目标

这意味着您的视图中还有一个额外的保留,这意味着不会调用dealloc(它仍然由计时器保留)。

基本上,不要使用dealloc使计时器无效 - 使用其他东西(可能是不再需要计时器时触发的方法)。