iOS NSTimer 的迴圈引用問題

2021-09-02 23:53:37 字數 1291 閱讀 9285

話不多說直接上重點,先看 timer 初始化:

//

// viewcontroller.swift

// 計時器

//// created by 張闖 on 2018/12/12.

//import uikit

class viewcontroller: uiviewcontroller

@objc func timeraction() -> void

deinit

}

這是一段 timer 初始化的方法,但是這種使用方式會造成 retain cycle! 原因如下:

// self.timer    self -> timer 強引用

// target: self timer -> self 強引用

要知道,打破 retain cycle 的方式必須有乙個引用是弱引用,掌握這個點就好,下面用兩種方式解決此問題.

在 block 內部對 viewcontroller 為弱引用,從而打破 retain cycle

self -> timer 強引用

//block block --> self 弱引用

timer = timer.scheduledtimer(withtimeinterval: 1, repeats: true, block: )

class timerproxy: nsobject 

override func forwardingtarget(for aselector: selector!) -> any?

}

//2.利用其它類作為 target,

timer = timer.scheduledtimer(timeinterval: 1, target: timerproxy(self), selector: #selector(timeraction), userinfo: nil, repeats: true)

實現思路如下:

// self -> timer        強引用

// timer -> newclass 強引用

// newclass --> self 弱引用

這裡 timerproxy 裡會用到訊息**技術,其實最優的處理方案是生成 nsproxy 子類,這樣會省去在方法列表查詢方法的過程!

以上是兩種解決 timer 迴圈引用的方法!希望對各位有所幫助!

迴圈引用的處理

迴圈引用 兩個類互相引用,導致單純互相引用標頭檔案,編譯無法通過。解決方案 首先,要理解宣告和實現之間的差別。宣告只需要在使用類的前面新增class 而實現是包含具體成員函式和變數的類。如例1.class a class b 1.此時可在a的前面宣告class b,就可以使用b了。在b中只需要正常引...

Block的迴圈引用

block是ios 4開始匯入的,類似lambda表示式,但是在使用block的過程中,很有可能引起引用迴圈。如下圖所示 當我們遇到這種情況時,可以有兩種解決方案。block修飾符 block id temp self void block void block 通過執行block方法,nil被賦值...

Block的迴圈引用

block的使用 1.概念 block實質就是乙個匿名函式塊,經過編譯器的編譯後,最終為乙個函式,block也是objective c中的物件,根據block物件建立時所處的資料區不同而進行區別 在棧上建立的block物件,nsconcretestackblock 在堆上建立的block物件,nsc...