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+) 始终使用原生 Timer
、scheduledTimer
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
}
在这种情况下,这段代码有什么区别:
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+) 始终使用原生 Timer
、scheduledTimer
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
}