在iOS应用中显示当前日期/时间的正确方法,并使其保持最新

时间:2013-07-21 14:00:51

标签: objective-c

我想知道这主要是出于理论/表现方面的事情,但是如果我需要在UILabel中显示当前的日期/时间,然后保持最新状态(比如,一分钟) ),最正确的方法是什么?

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

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}}中这样做。