我想知道这主要是出于理论/表现方面的事情,但是如果我需要在UILabel中显示当前的日期/时间,然后保持最新状态(比如,一分钟) ),最正确的方法是什么?
我在网上看过各种“时钟”应用程序的例子,基本上只有一个递归方法,在调用之间有1秒的延迟。另一种选择是创建一个可重复的计时器并将其添加到运行循环中。可能还有其他各种方法可以做到这一点。有没有一种方法比其他方式更好?
答案 0 :(得分:1)
递归方法不是一个好主意。
使用NSTimer
方法。在viewDidAppear
中创建重复计时器,在invalidate
中创建viewDidDisappear
计时器(以避免保留周期,a.k.a。强参考周期)。例如,假设您有timer
属性:
@property (nonatomic, strong) NSTimer *timer;
然后,您将按如下方式安排和无效计时器:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[self.timer invalidate];
self.timer = nil;
}
- (void)handleTimer:(NSTimer *)timer
{
// update your label here
}
如果您不释放和/或invalidate
计时器,它将保持对您的控制器的强引用,并且您最终可以获得强大的参考周期。并且您无法在dealloc
中解决这个强大的参考周期(因为在控制器没有更多强引用之前不会调用dealloc
;存在未被无效的重复NSTimer
会阻止dealloc
来自viewDidDisappear
,这就是为什么我们在{{1}}中这样做。