內存泄漏(Memory Leak)是指程序中己動態分配的堆內存因爲某種緣由程序未釋放或沒法釋放,形成系統內存的浪費,致使程序運行速度減慢甚至系統崩潰等嚴重後果。 -- 百度百科markdown
1. 使用的 Timer ,而且 Timer 的 target 爲 self
self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTimer(_ :)), userInfo: nil, repeats: true)
解決方式: 在須要釋放 self 時調用 Timer 的 invalidate
2. 兩對象的互相強引用 (通常出如今delegate,因此 delegate 要用 weak 修飾)
class A {
var b: B
}
class B {
var a: A
}
let a = A()
let b = B()
a.b = b
b.a = a
二者互相強引用誰都釋放不掉
解決方式: a 或 b 其中一個用 weak 修飾
weak var a: A
3. 閉包內部的強引用 (循環引用)
class A {
var avtion: (()->())?
}
class B{
var a: A = A()
func xx(){
a.action = {
self.xxx//(使用 self 作了一些操做)
}
}
}
解決方式:
使用[weak self] 或者 [unowned self] 來避免循環引用
a.action = { [weak self] in
guard let `self` = self else {return}//(黑魔法,閉包內能夠繼續使用 self )
}
unowned修飾相似於 OC 中的 assign,self 指向的是當前對象的地址,若是對象已經釋放這個 self 不會自動置爲 nil,此時必定要確保 self 沒有釋放,不然會有野指針的錯誤.
複製代碼
1. 靜態分析(預防針):
在 Xcode 菜單欄點擊 Product 選擇 Analyze (Command + Shift + B)
Xcode 會分析可能會形成泄露的語句
(Swift 的項目沒有跑出來泄露的,就用 OC 的項目看吧)
複製代碼
2. 內存泄露分析工具Leaks
Product => Profile(Command+I) => Leaks
點擊左上角像錄製同樣的按鈕 開始檢測
複製代碼
3. Debug Memory Graph
複製代碼
在後臺輸出框的查看層級按鈕旁邊
若是咱們已經知道某個對象沒有釋放(好比 controller pop沒有釋放掉)能夠經過這個方式查看到底是被誰強引用了.
複製代碼
4. 人工檢索(笑)
在知道沒有釋放掉的控制器中 Command + F 搜索 self,而後 檢索下是否是在 block 中有你不當心使用的 沒有 weak 處理的 self 吧.簡單暴力傻瓜式(事了拂衣去,深藏身與名)複製代碼