話不多說直接上重點,先看 timer 初始化:
這是一段 timer 初始化的方法,但是這種使用方式會造成 retain cycle! 原因如下://
// viewcontroller.swift
// 計時器
//// created by 張闖 on 2018/12/12.
//import uikit
class viewcontroller: uiviewcontroller
@objc func timeraction() -> void
deinit
}
要知道,打破 retain cycle 的方式必須有乙個引用是弱引用,掌握這個點就好,下面用兩種方式解決此問題.// self.timer self -> timer 強引用
// target: self timer -> self 強引用
在 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)
這裡 timerproxy 裡會用到訊息**技術,其實最優的處理方案是生成 nsproxy 子類,這樣會省去在方法列表查詢方法的過程!// self -> timer 強引用
// timer -> newclass 強引用
// newclass --> self 弱引用
以上是兩種解決 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...