老问题,和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);
}

Swift中的Timer计时器可能导致循环引用和内存泄漏。当使用repeats为true的计时器并设置target为self时,self与计时器互相强引用。解决办法是通过扩展timer,将操作作为userinfo的block传入,使用[weak self]避免循环引用,确保deinit可以正常执行。
最低0.47元/天 解锁文章
1446

被折叠的 条评论
为什么被折叠?



