我有一个带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调用,那么一切正常。 为什么呢?
答案 0 :(得分:0)
Dealloc
仅在您的对象没有剩余时(即最终发布后)被调用。
创建计时器时,您告诉它目标是self
。为避免以后出现并发症(即,self
从内存中释放并且计时器仍处于活动状态,因此它会保留self
。 计时器将保留其目标 强>
这意味着您的视图中还有一个额外的保留,这意味着不会调用dealloc(它仍然由计时器保留)。
基本上,不要使用dealloc
使计时器无效 - 使用其他东西(可能是不再需要计时器时触发的方法)。