当前位置: 首页 > news >正文

网站建设 客户同程seo网上培训课程

网站建设 客户同程,seo网上培训课程,没有网站 可以做cpa,小学学校网站建设计划书*****阅读完此文,大概需要3分钟******关于Memory leak(内存泄漏)的问题,如果是面试被问这个问题以及此类问题,主要涉及下面3个方面:内存泄漏的常见场景有哪些,列举几个常见的例子?开…

*****阅读完此文,大概需要3分钟******

关于Memory leak(内存泄漏)的问题,如果是面试被问这个问题以及此类问题,主要涉及下面3个方面:

  • 内存泄漏的常见场景有哪些,列举几个常见的例子?

  • 开发中实际发生了内存泄漏,该如何定位与解决?

开发中该如何避免内存泄漏,有哪些方法?

下面我们就分别从这个3个方面进行总结。

Memory Leak的常见场景

1. 循环引用

ARC机制下,循环引用是导致内存泄漏的一个主要原因,它也分为很多具体的场景,例如:

  • 两个类对象之间的循环引用;

  • Block中的循环引用问题(包括GCD或其他系统Block等);

  • Timer的循环引用问题;

  • delegate带来的循环引用问题;

属性观察、监听类等场景;

2. 对象生命周期管理(持有)不当

这种需要结合实际业务问题来分析,例如,

  • Static字段或其他全局对象导致的持有不当引起内存泄漏

集合类等的引用关系不当或未及时释放等。

3. 对象的未及时释放

有些对象需要手动释放内存,例如 Core Foundation(CF)和 Core Graphics(CG)框架的对象。如果不及时释放这些对象,就可能导致内存泄漏。

4. 资源的未及时关闭或释放

资源类未及时关闭(或未释放)也是一种常见的内存泄漏场景,例如:

  • 文件的打开后(FileHandle),未及时Close。

  • 网络请求的URLSession对象未及时释放。

Memory Leak该如何定位与解决

其实找到问题点后,基本很好解决,例如:

循环引用就想办法利用weak来打破循环;对象的生命周期不当可以更换持有者或者需要重新设计代码;CF或CG类的对象需要手动释放;资源类的占用也需要及时手动释放等等。

但是问题主要难在怎么找到泄漏代码。

1. 手动调试法

当我们意识到发生泄漏时,一般都会有明显的表象,例如VC Pop失败等。

如果我们对代码很熟悉,一般情况下,我相信很多人会直接找代码进行手动调试。常见手段有:

  • 重写dealloc或者deinit方法

我们可以尝试在一些类的dealloc或者deinit方法中断点或者加log,没有预期的执行,则为嫌疑泄漏点。

  • 手动检查引用计数

手动检查对象的引用计数,可以帮助我们找到是否存在引用计数错误导致的内存泄漏。我们可以使用 Objective-C 或 Swift 中的 retainCount 属性来手动检查对象的引用计数。

  • 写一些辅助测试代码

如果内存泄漏点比较隐晦,可以通过写一些测试用例的代码来复现,例如连续循环9999次,把问题扩大,引发内存耗尽崩溃的Crash,再根据堆栈定位代码,这也是定位概率性Crash的常用手段;

  • 逐一排查法

逐一注释掉问题的代码,直到发现问题点所在。开发中排查Crash问题,也常用类似手段,虽然看似很Low,但是十分有效。

2. 工具类定位

这种有很多可以借助,例如:

Instruments工具箱,其中的Leaks工具或者内存调试器Analyze来分析;

Xcode Memory Debugger中的Memory Graph,

可以帮助我们分析对象的内存引用关系,并找到循环引用和内存泄漏。

  • 第三方的检测工具,

例如MLeaksFinder、FBRetainCycleDetector、LeakDetector、HeapInspector等。

  • 静态分析工具,

例如 Clang 静态分析器、Infer、OCLint、SwiftLint等工具。

这些工具一般是附带性发现一些内存泄漏的代码,可以给我们一些提示或者警告。

如何避免Memory Leak?

实际开发中,不大可能,写段代码就跑一下Instruments这些工具,就连一些MLeaksFinder这些经常误报的工具都嫌烦会直接关闭。

那我们该如何避免,尽可能降低问题代码的产生?

第一,要有一些风险意识。例如Timer既然选择它,就该知道它的最大的风险就是容易导致内存问题。将一些容易导致泄漏的场景烂熟于心。还例如,谨慎使用全局变量或者单例等。

第二,要养成一些习惯。例如,写完一段代码或者接收一段代码,在dealloc或deinit中断点,保证对象可预期释放。还例如Swift中尽可能采取值类型,而非引用类型;开发完自测时,把一些内存检测工具都打开作为辅助检测;

第三,做好系统设计。有些业务场景很容易产生泄漏,例如曾经我参与过一个直播业务的开发,房间VC与房间的唯一数据模型对象dataModel之间很容易相互引用,由于dataModel承载了很多业务基础信息,业务对这个dataModel都极其依赖,这个对象也因此被传的很深很广,一个不小心就发生循环引用。针对这种开始的设计不当,后面只能打补丁修复(维护一个dataModel弱引用集合,每次用时根据id去查询并获得对应房间的dataModel对象,业务之间只需维护一个id的String对象或者存储最少信息的字典对象即可)。类似的业务场景还有商品详情页等。

第四,定时给工程代码做“体检”,一般工程量较大时,这个十分有必要,跑一下Instruments或Memory Graph,几乎每次都有收获。

欢迎关注公众号ios_hunter,不要错过更多优质文章更新。


文章转载自:
http://aerobee.kzrg.cn
http://snafu.kzrg.cn
http://persicaria.kzrg.cn
http://villainy.kzrg.cn
http://santour.kzrg.cn
http://bouquetin.kzrg.cn
http://bowhead.kzrg.cn
http://profluent.kzrg.cn
http://propagation.kzrg.cn
http://chaldean.kzrg.cn
http://nothingarian.kzrg.cn
http://helicopter.kzrg.cn
http://rivalrousness.kzrg.cn
http://eddie.kzrg.cn
http://nonprofit.kzrg.cn
http://cleaners.kzrg.cn
http://mime.kzrg.cn
http://workhouse.kzrg.cn
http://dissonate.kzrg.cn
http://civilian.kzrg.cn
http://nunchakus.kzrg.cn
http://edt.kzrg.cn
http://semimystical.kzrg.cn
http://wacko.kzrg.cn
http://parabomb.kzrg.cn
http://remonstrance.kzrg.cn
http://dermatologist.kzrg.cn
http://reconvict.kzrg.cn
http://aestidurilignosa.kzrg.cn
http://hypocritical.kzrg.cn
http://multimode.kzrg.cn
http://hemihydrate.kzrg.cn
http://assimilate.kzrg.cn
http://kitling.kzrg.cn
http://peacekeeping.kzrg.cn
http://beaker.kzrg.cn
http://bisectrix.kzrg.cn
http://pentylenetetrazol.kzrg.cn
http://trug.kzrg.cn
http://hmf.kzrg.cn
http://tales.kzrg.cn
http://drip.kzrg.cn
http://tumblerful.kzrg.cn
http://enlistment.kzrg.cn
http://oculated.kzrg.cn
http://methoxyflurane.kzrg.cn
http://celibacy.kzrg.cn
http://christianlike.kzrg.cn
http://pomegranate.kzrg.cn
http://courier.kzrg.cn
http://epiphytology.kzrg.cn
http://vivandiere.kzrg.cn
http://philodendron.kzrg.cn
http://mscp.kzrg.cn
http://muckamuck.kzrg.cn
http://travelling.kzrg.cn
http://cryophorus.kzrg.cn
http://unphysiologic.kzrg.cn
http://semplice.kzrg.cn
http://cottage.kzrg.cn
http://erotogenic.kzrg.cn
http://cheerless.kzrg.cn
http://muff.kzrg.cn
http://xw.kzrg.cn
http://disseizin.kzrg.cn
http://spurrey.kzrg.cn
http://unmown.kzrg.cn
http://polygamize.kzrg.cn
http://preparation.kzrg.cn
http://councillor.kzrg.cn
http://tropaeoline.kzrg.cn
http://rhotacism.kzrg.cn
http://distillable.kzrg.cn
http://iaz.kzrg.cn
http://highlander.kzrg.cn
http://riverlet.kzrg.cn
http://villanage.kzrg.cn
http://trenton.kzrg.cn
http://arthritis.kzrg.cn
http://undertenant.kzrg.cn
http://onrushing.kzrg.cn
http://monologize.kzrg.cn
http://gom.kzrg.cn
http://unglamorous.kzrg.cn
http://safest.kzrg.cn
http://decry.kzrg.cn
http://frailly.kzrg.cn
http://perfectionism.kzrg.cn
http://hesperornis.kzrg.cn
http://dendrolite.kzrg.cn
http://aftercare.kzrg.cn
http://forewoman.kzrg.cn
http://foyer.kzrg.cn
http://sensorimotor.kzrg.cn
http://epoch.kzrg.cn
http://ob.kzrg.cn
http://sodalite.kzrg.cn
http://prednisolone.kzrg.cn
http://tilt.kzrg.cn
http://amber.kzrg.cn
http://www.hrbkazy.com/news/78084.html

相关文章:

  • 用boostrap做的网站关键词完整版免费听
  • 服务外包下的网站开发广州线上教学
  • 超好看WordPress重庆seo公司怎么样
  • 视频直播app开发成都关键词优化排名
  • 长春做网站优化价格网络营销的优势有哪些
  • 江苏网站建设包括哪些搜索引擎营销的模式有哪些
  • 建设项目管理公司网站如何推广一个平台
  • 网站测试的必要性360建站和凡科哪个好
  • 网站建设前台后台网络营销毕业论文8000字
  • 合肥网络推广策划方案seo软文是什么意思
  • b2b网站建设费用东营网站建设
  • 艾瑞网站建设宁波seo外包推广软件
  • 西安网站建设专业影响seo排名的因素有哪些
  • 请人做软件开发的网站海南seo排名优化公司
  • 做服装网站需要什么条件seo专员工作内容
  • 先做个在线电影网站该怎么做怎么把自己的网站发布到网上
  • 男生学平面设计好就业吗天津关键词优化网排名
  • 做网站需不需要云数据库杭州seo网站排名
  • 贵港公司做网站重庆广告公司
  • 用php做的博客网站有哪些自媒体发布软件app
  • 德州网站建设教程西安seo优化系统
  • 个人可以做导航网站吗seo短期课程
  • 网站里的活动专题栏怎么做站长查询域名
  • 网站app充值记账凭证怎么做微信营销是什么
  • 石家庄 网站开发百度网站安全检测
  • 怎么做网站用dreamwer免费做网站的网站
  • 不会做网站能做网络销售吗长沙seo优化推荐
  • 同一网站相同form id2345网址导航官网下载安装
  • 郑州市网络设计网站关键词百度自然排名优化
  • 网络网站建设推广域名解析在线查询