1: NSTimer不能置零導(dǎo)致VC不釋放。導(dǎo)致內(nèi)存泄露
1.1 解決的實(shí)例方法一:
import UIKit
class TwoViewController: UIViewController {
var customTimer:Timer?
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.orange
customTimer = Timer.init(timeInterval: 1, target: self, selector: #selector(TwoViewController.timrClick(sender:)), userInfo: self, repeats: true)
RunLoop.current.add(customTimer!, forMode: RunLoopMode.commonModes)
}
func timrClick(sender:Timer) {
print("timrClick: \(sender.timeInterval)")
}
deinit {
print("\(object_getClass(self)) delloc")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
customTimer?.invalidate()
}
}
結(jié)果能不能釋放控制器那, 有沒有問題
- 1: 單純是pop沒有問題, 沒有深層的push. 沒有問題
- 2: 如果有深層的跳轉(zhuǎn), 比如當(dāng)前的控制器的定時(shí)器是控制
倒計(jì)時(shí)
,圖片輪播
的盐茎, 這樣我們的push的時(shí)候 定時(shí)就停掉了兴垦,所以這個(gè)方法不可取
1.2 解決的實(shí)例方法二:
和方法一類似 但是在離開當(dāng)前的視圖的時(shí)候 做一個(gè)判斷, 判斷是pop還是push
具體步驟:
1: 視圖展示的時(shí)候記錄一下, 當(dāng)前導(dǎo)航控制器的子控制器的數(shù)量
2: 視圖離開(包括pop.push), 當(dāng)前導(dǎo)航控制器的childVc的數(shù)量, 與之前的做一個(gè)比較
注: push.pop 是 壓棧和出棧的過程, 修改navVc的子控制器的數(shù)量
import UIKit
class TwoViewController: UIViewController {
var vcCount = 0
var customTimer:Timer?
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.orange
vcCount = (self.navigationController?.viewControllers.count)!
customTimer = Timer.init(timeInterval: 1, target: self, selector: #selector(TwoViewController.timrClick(sender:)), userInfo: self, repeats: true)
RunLoop.current.add(customTimer!, forMode: RunLoopMode.commonModes)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
guard let tmpCount = self.navigationController?.viewControllers.count else {
return
}
// 如果當(dāng)前的控制器數(shù)量大于一開始的數(shù)量 說明是push
// 如果小于 說明是pop
if tmpCount < vcCount {
self.customTimer?.invalidate()
self.customTimer = nil
}
}
func timrClick(sender:Timer) {
print("timrClick: \(sender.timeInterval)")
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.navigationController?.pushViewController(ThreeViewController(), animated: true)
}
deinit {
print("\(object_getClass(self)) delloc")
}
}