最近APP要求优化,所以内存泄露的检查自然必不可少
1.0 APP添加以下代码解决了因闭包产生循环引用导致的内存泄露(
定义一个基类BaseViewController,让所有VC继承,批量replaceVC的继承类,在基类里面重写一下deinit方法, BaseViewController中添加以下代码
import UIKit
class BaseViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
deinit {
printLog(msg: "\(type(of: self))deinit")
}
}
**查找项目用到闭包回调的地方, 用[weak self]修饰
APP中再次应用回调闭包时,如果闭包中用到了self,尽量用[weak self]修饰,避免循环引用
2.0通过Xcode自带的Instruments工具查找内存泄漏
目前修复的问题--Swift md5加密这个方法产生的内存泄露
func md5(strs:String) ->String!{
let str = strs.cString(using: String.Encoding.utf8)
let strLen = CUnsignedInt(strs.lengthOfBytes(using: String.Encoding.utf8))
let digestLen = Int(CC_MD5_DIGEST_LENGTH)
let result = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen)
CC_MD5(str!, strLen, result)
let hash = NSMutableString()
for i in 0 ..< digestLen {
hash.appendFormat("%02x", result[I])
}
// result.deinitialize()修复前
free(result)//修复后
return String(format: hash as String)
}
3.0通过Github上的一个第三方iOS内存泄露检测工具MLeaksFinder(腾讯出品),地址https://github.com/Tencent/MLeaksFinder
导入工具MLeaksFinde
在Podfile里添加pod 'MLeaksFinder',然后终端pod istall安装
MLeaksFinde优点
自动检测并弹框提醒,无需打开额外的检测工具,代码没有侵入性,无需一个个场景去重复操作。它默认只检测应用里UIViewController和UIView对象的泄露情况,因为一般应用里内存泄露影响最严重的就是这两种内存占用比较高的对象,它也可以在代码里设置扩展以检测其他类型的对象泄露情况;
MLeaksFinder的代码没有侵入性,这意味着你不用为了引入它而修改你原有的项目代码,甚至连发正式版都不用移除掉,因为它只在debug版本里起作用。
MLeaksFinde使用效果,例子如下
引入MLeaksFinde在项目实时运行的时候就会自动检测并弹框提醒,如下
20180407183453284.png
如图上提示表示当前栈从上往下看,最后一个对象也就是MyTableViewCell 的对象没被释放,在它之上的三个其他对象已经成功被释放了。
网友评论