繁体   English   中英

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

[英]Don't call “dealloc” method when I use “layoutSubviews” or “didMoveToSuperview”

我有一个带有 UIView 的 XIB。 此 UIView 与 UIView - Page1 的自定义 class 相关联(在 IB 中)。 这个文件的所有者是 MainMenuController(当然是 UIViewController)。 我在使用“initWithNibName”初始化 controller 并将其添加到 navController.viewControllers 时使用此 XIB。

在 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”,并且不会从 memory 卸载 object 并且计时器正在运行。 如果我在“didMoveToSuperview”块中注释行,则调用dealloc,一切正常。 为什么?

仅当您的Dealloc没有保留时(即,在您的最终版本之后),才会调用 Dealloc。

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

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

基本上,不要使用dealloc来使您的计时器无效 - 使用其他东西(也许当您的计时器不再需要时触发的方法)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM