0

我想知道这主要是出于理论/性能方面的问题,但是如果我需要在 UILabel 或其他内容中显示当前日期/时间,然后保持最新(例如,精确到分钟),那么是最正确的方法吗?

我已经在网上看到了各种“时钟”应用程序示例,这些应用程序基本上只有一个递归方法,在调用之间以 1 秒的延迟运行。另一种选择是创建一个可重复的计时器并将其添加到运行循环中。可能还有多种其他方法可以做到这一点。有没有比其他方法更好的方法?

4

1 回答 1

1

递归方法不是一个好主意。

使用NSTimer方法。创建重复计时器viewDidAppearinvalidate计时器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.

于 2013-07-21T14:17:09.690 回答