很多iOS开发的朋友都是比较关心内存泄漏的问题,在实际的开发工作中首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复。最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck工具,功能非常强大。

  内存的泄漏是会关系到线上的稳定性和性能。内存泄露将会是导致这样的情况发生:

  1.若是内存资源不足发生难以排查的线上bug

  2.被泄露对象的存在,将会是导致的一些业务bug,例如是泄露的对象它们是仍在接受全局的一个通知

  3.一些性能问题,是会导致用户使用app时越来越卡

  内存泄露发现分成静态扫描和运行时检测,本文主要讲运行时检测。

  关于静态扫描

  常用的一些静态扫描的工具:

  xcode analyzer

  OCLint

  Infer

  运行时动态检测

  因为在静态扫描不能发现所有的内存泄露问题,因此在运动时检测,是必不可少的一个操作。

  Allocation

  Xcode中的的Allocation是可以通过比较不同时间段的对象,用来是分析出是否发生了一些内存泄露。前提必须是每个页面的命名要符合规范,就比如说宝贝详情页的所有对象,这些都是应用的前缀+宝贝详情页面前缀+具体对象名,当退出页面的时候才会是知道相应的对象是否被释放了,那是因为stack最底部的页面的对象经常是驻在内存中。

  Allocation是通过和Monkey配合,当在回归测试的时候,会自动运行并通过计算内存占用率,就可以判断出新的开发版本是否发生了内存泄露,但是无法知道具体是哪个对象没有释放,局限性就是只能通过全局的一个判断。

  重点是如何排查?

  当发现了内存泄露后,排查并解决,这才是最关键的一步。开发者是根据泄露的对象,重点的去排查block和两个以上对象循环引用的最终情况。

  发现是ViewController发生内存泄露,就要是重点的去查看一下ViewController里面的block是否忘记声明weak了,当ViewController被其他对象持有的情况不常见。因此若是用RAC的话,这就要去记得weakly和strongly要成对出现,否则将会是发生内存的泄露。

  实际上最常发生的是View的内存泄露问题,首先查看是发生内存泄露的view之间是否有delegate的关系,若有,则去看delegate属性有没有声明weak,一般的由于service或者读取缓存等异步操作引起的内存泄露问题。

  解决内存泄漏的问题最主要的还是在编码的时候尽量的做到规范一些,学会利用工具去排查是积累经验的有效手段,静态扫描能解决一部分问题,动态扫描是最后的保证。

一起来看看IOS内存泄漏的一个问题的更多相关文章

  1. 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(中)- IOS不为人知的Bug

    前言: 话说昨晚还是前晚,写了一篇:讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上) 文章写到最后时,多了很多莫名奇妙的问题!!! 为了解决了这些莫名奇妙的问题,我又战斗了2 ...

  2. 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(下)- block中任性用self

    前言: 在处理完框架内存泄漏的问题后,见上篇:讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(中)- IOS不为人知的Bug 发现业务代码有一个地方的内存没释放,原因很也简单: ...

  3. iOS内存泄漏自动检测工具PLeakSniffer

    新款objective-C内存泄漏自动检测工具 PLeakSniffer , GitHub地址 (https://github.com/music4kid/PLeakSniffer). 背景 前些天读 ...

  4. 使用Xcode和Instruments调试解决iOS内存泄漏

    尽管iOS 5.0加入版本号之后ARC机制,由于相互引用关系是复杂的.内存泄漏可能仍然存在.于是,懂原理是非常重要的. 这里讲述在没有ARC的情况下,怎样使用Instruments来查找程序中的内存泄 ...

  5. iOS 内存泄漏

      我一直以为现在都是自动内存管理了,还哪有什么内存泄漏啊.一检测才知道,不是我太相信Xcode了,就是我太单纯了.iOS开发中遇到的内存泄漏主要有几下几种: (1)对象不能释放.使用Core Fou ...

  6. 经验之道:最有效的iOS内存泄漏检测

    版权声明:本文由胡涛原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/125 来源:腾云阁 https://www.qclou ...

  7. iOS 内存泄漏监测自动化

    在 Android 上,Square 这家公司提供了非常有名的工具: leakcanary ,来帮助开发者们在日常开发过程中就能够发现内存泄漏.但在 iOS 上呢?在 Google 的时候,我发现了两 ...

  8. iOS 内存泄漏排查以及处理

    使用Xcode7的Instruments检测解决iOS内存泄露   文/笨笨的糯糯(简书作者)原文链接:http://www.jianshu.com/p/0837331875f0作为一名iOS开发攻城 ...

  9. IOS内存泄漏

    1. . - (void)viewDidLoad { [superviewDidLoad]; self.view.frame=CGRectMake(, , , ); NSArray *title1=[ ...

随机推荐

  1. C语言讲解命令行参数

    命令行(command line):是在命令行环境中,用户为运行程序输入命令的行. 命令行参数(command-line argument): 是同一行的附加项. C编译器允许main()没有参数或者 ...

  2. centos7博客的基础搭建(LNMP)

    linux [root@zbb wordpress]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) nginx echo ...

  3. Juniper SRX550防火墙web页面CPU达到100%的故障解决办法

    Juniper SRX550防火墙web页面CPU达到100%的故障解决办法 利用telnet远程连接主机,对web页面注销重新登录即可,在配置中输入命令:run restart web-manage ...

  4. 在Mac上安装mysql

    进入这个网站: https://dev.mysql.com/downloads/mysql/ 然后点击安装就行了. 注意在这里启动mysql 然后mac上所有的mysql命令都得用绝对路径才能生效

  5. KeyStore相关

    http://blog.csdn.net/liuquan0071/article/details/50318405 一. HTTPS概念 1. 简介 HTTPS(全称:Hypertext Transf ...

  6. IOS Intro - Property Synthesis

    http://www.thecodecrate.com/ios/objective-c/objective-c-property-synthesize/ 01. atomic              ...

  7. Linux下wget下载软件小技巧以及安装jdk、tomcat与ftp服务器

    一.ftp的安装 装个ftp搞了一下午,感觉以前没那么麻烦的呀,结果到晚上才发现是实验室网的问题,换连手机的热点马上可以了,真是尴尬,把基本安装步骤记录一下: 1.检查安装vsftpd软件 使用如下命 ...

  8. escape、encodeURI以及encodeURIComponent

    在标准中,只有字母和数字[0-9a-zA-Z].一些特殊符号"$-_.+!*'(),"[不包括双引号].以及某些保留字,才可以不经过编码直接用于URL.但是比如我们搜索时,往往会输 ...

  9. 硬盘和显卡的访问与控制(一)——《x86汇编语言:从实模式到保护模式》读书笔记01

    本文是<x86汇编语言:从实模式到保护模式>(电子工业出版社)的读书实验笔记. 这篇文章我们先不分析代码,而是说一下在Bochs环境下如何看到实验结果. 需要的源码文件 第一个文件是加载程 ...

  10. Ubuntu环境下安装Bochs

    首先说一下我的Ubuntu版本,敲命令 sudo lsb_release -a 就可以看到 No LSB modules are available. Distributor ID: Ubuntu D ...