老问题,和OC写法差不多。用计时器发现deinit方法不走,页面有内存泄漏,而且计时器关不掉。
deinit {
// 销毁计时器
timer?.invalidate();
}
可以在特定节点主动调用
timer?.invalidate();
但是并不完美~~
简单说下问题点:self对自己的计时器属性timer强引用,timer设置target:self,并且是循环操作计时器(repeats:true),timer对self也是强引用,循环引用了。deinit就不执行。
方案:timer扩展方法,将要执行的操作,就是selector(...),以block的形式传入userinfo中,以此打破循环。
//
// Timer+Extensions.swift
// MPPForSwift
//
// Created by meipaipai on 2017/8/22.
// Copyright © 2017年 liyinkai. All rights reserved.
//
import Foundation
extension Timer {
class func lyk_scheduledTimer (timeInterval: TimeInterval, repeats: Bool, completion:((_ timer:Timer)->())) -> Timer{
return Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector: #selector(lyk_completionLoop(timer:)),
userInfo: completion, repeats: repeats);
}