Ios 如果不在ViewWillEnglishe中执行NSTimer,如何使其失效/取消失效?
我需要在控制器解除锁定之前使计时器失效Ios 如果不在ViewWillEnglishe中执行NSTimer,如何使其失效/取消失效?,ios,swift,oop,Ios,Swift,Oop,我需要在控制器解除锁定之前使计时器失效 var faderTimer: NSTimer? override func viewDidLoad() { super.viewDidLoad() self.faderTimer = NSTimer.scheduledTimerWithTimeInterval(self.fadeTime, target: self, selector: Selector("fadeBackground"), userInfo: nil, repeats
var faderTimer: NSTimer?
override func viewDidLoad() {
super.viewDidLoad()
self.faderTimer = NSTimer.scheduledTimerWithTimeInterval(self.fadeTime, target: self, selector: Selector("fadeBackground"), userInfo: nil, repeats: true)
}
然而,我不能把它放在Denit()中。似乎我必须在
视图中使其无效,否则将消失。但是,我不想这样做,因为这会弄乱背景切换。(从后台返回不会调用viewwillbeen,因此我必须使用通知来启动计时器,这是一个巨大的痛苦。)我宁愿在viewDidLoad上启动计时器,在deinit()上停止它
我宁愿在viewDidLoad
上启动计时器,然后在deinit()上停止计时器
嗯,你不能。计时器将保留您(self
),并将继续执行此操作,直到其失效。这意味着,除非您在别处采取措施使计时器无效,deinit
将永远不会被调用,视图控制器将泄漏(它永远不会消失,它所持有的所有内存及其所有属性的内存将继续被持有)。你必须找到另一个地方使计时器失效;事情就是这样
如果你不喜欢,那就不要使用NSTimer。改用GCD和dispatch\u source\t
。这样做的好处是它基于一个块(一个闭包)——您可以在块内使用弱自我
或无主自我
,以防止自己被保留,因此,如果您愿意,您可以在deinit
中使计时器无效。这正是为什么我创建了一个,作为NSTimer的替代品。我知道这已经太晚了,但是你可以在视图中取消它,就像那样出现
deinit {
//never gets called
if let timer = self.faderTimer {
self.faderTimer!.invalidate()
self.faderTimer = nil
}
}
如果isMovingFromParentViewController
返回true,则表示用户点击后退按钮并弹出到导航堆栈中的最后一个视图控制器。因此,deinit
将在真实位置调用 很抱歉,您能否澄清在视图中执行此操作的错误将消失
?它的调用不仅仅是因为用户为应用设置背景,那么问题出在哪里呢?在没有ViewWill的情况下,最好在什么地方进行呢?问题是,当我在那里做的时候,它不会在后台入口被调用。因此,我需要实现通知中心,使代码更加复杂。viewwilldiscover
是一个很好的地方。它保证在视图控制器的视图即将从界面中取出时被调用,这正是您想要知道的。“问题是,当我在那里执行此操作时,它不会在后台入口被调用”那又怎样?你还没有解释这有什么问题。你进入后台,计时器停止。你回来了,计时器又开始运行了。这不是问题所在。问题是当视图控制器不存在时会发生什么-它不能,因为计时器仍在运行并且仍在保留它。你必须做点什么。这就是NSTimer内存管理的本质。@matt:github链接过时了吗?@MartinR是的,它们很快就会再次过时!:)同时,这里是前面评论中引用的文件的当前位置:非常感谢!isMovingFromParentViewController正是我所需要的:)
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
if isMovingFromParentViewController() {
yourTimer.invalidate()
}
}