美文网首页
ios排除内存泄露的方案和修复

ios排除内存泄露的方案和修复

作者: Peanut_S1 | 来源:发表于2020-04-08 18:32 被阅读0次

    最近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 的对象没被释放,在它之上的三个其他对象已经成功被释放了。

    相关文章

      网友评论

          本文标题:ios排除内存泄露的方案和修复

          本文链接:https://www.haomeiwen.com/subject/eefxmhtx.html