这里的代码不多,但这个问题严重让我感到烦恼!
·H:
@interface processController : UIViewController {
NSTimer *timer;
}
@property (nonatomic, retain) NSTimer *timer;
的.m:
- (void)viewDidLoad {
[super viewDidLoad];
timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector (main) userInfo:nil repeats:YES];
}
- (void)main {
NSLog(@"testing");
}
- (void)viewDidUnload {
[self.timer invalidate];
self.timer = nil;
}
奇怪的是,当我解雇这段代码时:
ViewController *main = [[ViewController alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:main animated:YES];
并切换视图,计时器一直开火!我做错了什么?
答案 0 :(得分:5)
viewDidUnload
不会被调用,而当应用程序收到内存警告时,仅。当UIViewController被释放时也不会调用它。来自Apple的文档:
当出现内存不足的情况和当前视图控制器时 如果不需要视图,系统可能会选择从中删除这些视图 记忆。在视图控制器的视图之后调用此方法 已经发布,你有机会进行任何最后的清理工作。如果你的 视图控制器存储对视图或其视图的单独引用 子视图,您应该使用此方法来释放这些引用。您 也可以使用此方法删除对您的任何对象的引用 创建以支持视图但现在不再需要了 观点消失了。您不应该使用此方法来释放用户数据或 任何其他无法轻易重建的信息。
您很可能打算使用viewWillDisappear
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[self.timer invalidate];
self.timer = nil;
}
您可能希望在viewWillAppear中启动计时器:因为只要访问控制器的view属性就会调用viewDidLoad。显示视图时并不是必然的。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(main) userInfo:nil repeats:YES];
}
我建议阅读viewDidLoad和viewDidUnload的讨论以及UIViewController documentation中的viewWillAppear和viewWillDisappear。