2012-07-07 83 views
1

这里没有太多的代码,但这个问题严重地让我烦恼!NSTimer不会失效

.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]; 

和切换视图时,计时器保持射击!我究竟做错了什么?

回答

5

viewDidUnload视图时从屏幕中删除,但在由应用程序接收只存储器警告不被调用。当UIViewController被释放时,它也不会被调用。从苹果公司的文档:

当低内存条件发生并且不需要当前视图控制器的 视图,该系统可以选择从 内存中删除这些看法。这个方法在视图控制器的视图 被释放后调用,并且是您执行任何最终清理的机会。如果您的视图控制器存储对视图或其子视图的单独引用,则应使用此方法来释放这些引用。您还可以使用此方法删除对您创建的任何对象的引用,以支持该视图,但现在不再需要该视图,因为该视图不再需要。您不应该使用此方法释放用户数据或任何其他无法轻易重新创建的信息。

你最有可能意味着使用viewWillDisappear

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [self.timer invalidate]; 
    self.timer = nil; 
} 

你可能想开始新的计时器在viewWillAppear中:为viewDidLoad中被尽快控制器的视图属性被称为访问。当视图被显示时不是紧张的。

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(main) userInfo:nil repeats:YES]; 
} 

我建议你阅读从UIViewController documentation对viewDidLoad中和viewDidUnload以及viewWillAppear中和viewWillDisappear的讨论。

+2

是的,值得注意的是,当你的VC被释放时,甚至不会调用viewDidUnload,它实际上*只有*当VC *仍然在*时,但是你的视图在屏幕外,然后操作系统发送低内存(或类似的情况)。根据我的经验,这只是我在导航层次结构中深入2或3层并模拟低内存。 – 2012-07-07 16:34:24

+0

感谢@ctrahey指出我应该澄清何时调用viewDidUnload。为了更加清晰,添加了Apple对该方法的描述。 – 2012-07-07 16:43:50

+0

此外,将所有实例-viewDidUnload和-viewDidLoad转换为-view(Will | Did)将是明智的选择:-view(Will | Did)将消失:到10月份时为止。向聪明人说话。 – 2012-07-07 17:20:05