在swift中,要使用定時器就須要用到對象NSTimer。經過NSTimer的實例化後,就能夠調用fire方法來啓用了。swift
NSTimer有2個構造函數函數
init(timeInterval ti: NSTimeInterval, invocation: NSInvocation!, repeats yesOrNo: Bool) -> NSTimer init(timeInterval ti: NSTimeInterval, target aTarget: AnyObject!, selector aSelector: Selector, userInfo: AnyObject!, repeats yesOrNo: Bool) -> NSTimer
經過個人實踐後,發現這2個構造函數都是假的,基本上不能使用。第一個構造函數的invocation參數貌似swift尚未實現(xCode6 beta)經過mac+left click點進去後,裏面啥也沒有。到是在stackoverflow上看到有大神使用的,沒有嘗試:orm
NSMethodSignature *sgn = [self methodSignatureForSelector:@selector(onTick:)]; NSInvocation *inv = [NSInvocation invocationWithMethodSignature: sgn]; [inv setTarget: self]; [inv setSelector:@selector(onTick:)]; NSTimer *t = [NSTimer timerWithTimeInterval: 1.0 invocation:inv repeats:YES];
顯然在swift中,尚未NSInvocation.invocationWithMethodSignature方法的實現。對象
第二個構造函數,經過它能夠實例化NSTimer對象,但只能觸發一次。以後就沒用了,貌似repeats的參數是沒有做用的。blog
var timer = NSTimer(1.0, target: self, selector: "timerFireMethod:", userInfo: nil, repeats:true); timer.fire()
後來看到網上你們都使用的靜態函數的形式實例化,也嘗試了一下,居然成功了:內存
func doTimer(){ var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "timerFireMethod:", userInfo: nil, repeats:true); timer.fire() } func timerFireMethod(timer: NSTimer) { var formatter = NSDateFormatter(); formatter.dateFormat = "MM/dd/yyyy HH:mm:ss" var strNow = formatter.stringFromDate(NSDate()) txta.text = "\(strNow)" }
程序的目的就是在view上的label中實時顯示當前的時間。get
總結:string
一、NSTimer只能使用靜態函數來實例化該對象it
二、使用靜態函數來實例化對象的時候,居然須要傳一個實例對象的方法(經過selector),這個感受有些違背面向對象的思想的。任何對象的成員的訪問都須要經過實例化對象來調用。swift中有全局函數,想一想也釋然了,畢竟他是一門剛出來的語言仍是須要時間沉澱的。io
三、在模擬器中,運行10分鐘,程序所使用的memory,從12.0MB上升到了12.5MB。感受對內存的要求仍是比較高的,不知道有沒有其它更好的方法實現。