如何查找内存泄露

栏目: IOS · 发布时间: 5年前

内容简介:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 -- 百度百科

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 -- 百度百科

1.内存泄露原因

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 没有释放,否则会有野指针的错误.
复制代码

2.查找内存泄露的方法

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 吧.简单暴力傻瓜式(事了拂衣去,深藏身与名)复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员实用算法

程序员实用算法

Andrew Binstock、John Rex / 陈宗斌 / 机械工业出版社 / 2009-9 / 65.00元

《程序员实用算法》重点关注的是实用、立即可用的代码,并且广泛讨论了可移植性和特定于实现的细节。《程序员实用算法》作者介绍了一些有用但很少被讨论的算法,它们可用于语音查找、日期和时间例程(直到公元1年)、B树和索引文件、数据压缩、任意精度的算术、校验和与数据验证,并且还最全面地介绍了查找例程、排序算法和数据结构。 《程序员实用算法》结构清晰,示例丰富,可作为广大程序员的参考用书。一起来看看 《程序员实用算法》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具