我想知道這主要是出於理論/性能方面,但如果我需要在UILabel中顯示當前日期/時間或者什麼東西,然後保持它的最新狀態(比如下降到最新),那麼最正確的方法是什麼?在iOS應用程序中顯示當前日期/時間並保持最新狀態的正確方法
我見過各種各樣的「時鐘」應用程序的例子,它們基本上只有一個遞歸方法,在調用之間延遲1秒鐘運行。另一種選擇是創建一個可重複的計時器並將其添加到運行循環中。也可能有其他多種方法來做到這一點。有沒有比其他方式更好的方法?
我想知道這主要是出於理論/性能方面,但如果我需要在UILabel中顯示當前日期/時間或者什麼東西,然後保持它的最新狀態(比如下降到最新),那麼最正確的方法是什麼?在iOS應用程序中顯示當前日期/時間並保持最新狀態的正確方法
我見過各種各樣的「時鐘」應用程序的例子,它們基本上只有一個遞歸方法,在調用之間延遲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
。
你能解釋一下這種方法如何避免保留週期嗎? – chinabuffet
@chinabuffet查看擴展的答案。 – Rob
iOS狀態欄中顯示的日期/時間不合理的原因是什麼? – Abizern
這是,我真的只是出於好奇而問這個:) – chinabuffet