我想知道这主要是出于理论/性能方面的问题,但是如果我需要在 UILabel 或其他内容中显示当前日期/时间,然后保持最新(例如,精确到分钟),那么是最正确的方法吗?
我已经在网上看到了各种“时钟”应用程序示例,这些应用程序基本上只有一个递归方法,在调用之间以 1 秒的延迟运行。另一种选择是创建一个可重复的计时器并将其添加到运行循环中。可能还有多种其他方法可以做到这一点。有没有比其他方法更好的方法?
我想知道这主要是出于理论/性能方面的问题,但是如果我需要在 UILabel 或其他内容中显示当前日期/时间,然后保持最新(例如,精确到分钟),那么是最正确的方法吗?
我已经在网上看到了各种“时钟”应用程序示例,这些应用程序基本上只有一个递归方法,在调用之间以 1 秒的延迟运行。另一种选择是创建一个可重复的计时器并将其添加到运行循环中。可能还有多种其他方法可以做到这一点。有没有比其他方法更好的方法?
递归方法不是一个好主意。
使用NSTimer
方法。创建重复计时器viewDidAppear
和invalidate
计时器viewDidDisappear
(以避免保留周期,也就是强参考周期)。例如,假设您有一个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
.