Swift 和 Obj-C 中的 NSTimer

NSTimer in Swift and Obj-C

在这种情况下,这段代码有什么区别:

OBJ-C :

- (void)viewDidLoad {
[super viewDidLoad];

NSTimer *myTimer = [NSTimer timerWithTimeInterval:5.0 target:self selector:@selector(start) userInfo:nil repeats:YES];

[[NSRunLoop mainRunLoop] addTimer:myTimer forMode:NSDefaultRunLoopMode];

[self start];
}

在 Obj-C 中,此代码运行顺利,我使用类似的代码使用 Swift,如下所示:

override func viewDidLoad() {
    super.viewDidLoad()

    var myTimer = NSTimer(timeInterval: 5.0, target: self, selector: Selector(start()), userInfo: nil, repeats: true)
    NSRunLoop.mainRunLoop().addTimer(myTimer, forMode: NSDefaultRunLoopMode)


    start()
}

但 5 秒后出现错误,不知道具体错误是什么,只是 EXC_BAD_ACCESS(code= 1, address=0x0)

我错过了什么?

let myTimer = NSTimer(timeInterval: 5.0, target: self, selector: "start", userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(myTimer, forMode: NSDefaultRunLoopMode)

func start() {
    print("Fired")
}
- (void)setupTimer {
    NSTimer *t = [NSTimer scheduledTimerWithTimeInterval:2.0
                                                  target:self
                                                selector:@selector(onTick:)
                                                userInfo:nil 
                                                 repeats:NO];  

}

- (void)onTick:(NSTimer *)timer {
// Put your code here
}

如今 (Swift 3+) 始终使用原生 TimerscheduledTimer API 以及 - 只要有可能 - 基于块的 API

override func viewDidLoad() {
    super.viewDidLoad()

    let myTimer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true) { timer in
       // do something
    } 
}

并且如果您使用基于 API 的目标/操作,请使用 Swift #selector 语法并将操作方法​​放在 viewDidLoad

之外
override func viewDidLoad() {
    super.viewDidLoad()

    let myTimer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(start), userInfo: nil, repeats: true)
} 

@objc func start(_ timer: Timer) {
    // do something
}