如何将函数作为参数传递以避免保留周期?

时间:2016-10-21 17:36:18

标签: swift retain-cycle

我有一个视图控制器,我试图通过传递一个函数作为块参数来调用Timer.scheduledTimer(withTimeInterval:repeats:block),而不是动态创建一个块。我有这个视图控制器:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        Timer.scheduledTimer(withTimeInterval: 5,
                             repeats: true,
                             block: onTimer)    
    }

    deinit {
        print("deinit \(self)")
    }

    func onTimer(_ timer: Timer) {
        print("Timer did fire")
    }
}

呼叫保留视图控制器,因此永远不会释放控制器。

我知道我可以通过以下方式替换呼叫来使其正常工作:

    Timer.scheduledTimer(withTimeInterval: 5,
                         repeats: true) { [weak self] timer in

                            self?.onTimer(timer)
    }

但是我想知道是否有办法直接发送onTimer方法并避免保留周期。

感谢。

1 个答案:

答案 0 :(得分:2)

您应该调用invalidate()方法:

  

此方法是从RunLoop对象中删除计时器的唯一方法。   RunLoop对象也删除了对计时器的强引用   就在invalidate()方法返回之前或之后的某个时刻。

     

如果配置了目标和用户信息对象,则为接收者   删除了对这些对象的强引用。

在代码中的某处,您应该实现:

timer.invalidate()

希望这会有所帮助。