我正在使用此代码来延迟tableView的出现/消失。
var timer = NSTimer()
let delay = 0.5
timer = NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: #selector(delayedHideTableView), userInfo: nil, repeats: false) // Warning: Variable 'timer' was written to, but never read
也许我的定时器变量有问题,怎么能避免这个错误?我知道我可以使用打印(计时器)声明,但我不认为这可以被视为最佳实践。
答案 0 :(得分:4)
始终记得在类deinit或视图被删除时使计时器无效,否则将来会导致难以发现的内存崩溃。
所以只需添加:
deinit {
self.timer.invalidate()
}
在你班上。
我已经看到很多奇怪的错误,因为没有deinit计时器,观察者等。所以保持良好的习惯。
答案 1 :(得分:4)
在您的代码中存在一些问题:
您将timer
声明为变量,您使用NSTimer()
填充它,并且下面有2行覆盖该值。那么为什么首先将NSTimer
分配给timer
?
如果您不使用NSTimer.scheduledTimerWithTimeInterval(...)
返回的值,为什么要将其保存到timer
?
最后,要将使用选择器的方法调用到不继承NSObject
的类中,您应该使用@objc
公开该方法。
#selector
的正确语法为#selector(ClassName.methodName)
所以
class Foo {
func foo() {
let delay = 0.5
NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: #selector(Foo.delayedHideTableView), userInfo: nil, repeats: false)
}
@objc func delayedHideTableView() {}
}
答案 2 :(得分:3)
不要创建timer
变量,因为它不是必需的。就在下面做:
NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: #selector(delayedHideTableView), userInfo: nil, repeats: false)
即使您不需要delay
变量,除非它动态变化。
答案 3 :(得分:2)
在你的例子中,你根本不需要NSTimer的变量。所以你可以删除
var timer = NSTimer()
用户代码指出它已经在那里启动了一个计时器。所以如果你需要这个变量,你应该做
var timer:NSTimer
这不会启动计时器,而是将属性的类型设置为正确的。
但对你的问题的一个简短回答是你可以让代码看起来像这样:
let delay = 0.5
NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: #selector(delayedHideTableView), userInfo: nil, repeats: false)
并且警告将消失。