[英]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.