美文网首页iOS程序员iOS程序猿
iOS 中内存泄露 - Block就会循环依赖?

iOS 中内存泄露 - Block就会循环依赖?

作者: 素还真人 | 来源:发表于2017-10-12 11:15 被阅读105次

Hi,

本文主讲,Block中使用self,为何会循环依赖。


最近公司对代码质量很在意,这是好事。

我们使用Coverityz做了检测,的确有一大堆的问题。

So tm what!

我呢,研究各种case下的问题,以及解决方案。

Now,轮到了内存泄露的case,先来搞这个Block导致的内存泄露,内存常驻吧。反正tm的都是内存浪费。

先来了解下,啥是内存吧,为何泄露?

我简单搜了一下,查看了该猿友的文章http://www.cnblogs.com/houjun/p/4909413.html

通俗点,有的区域(栈)的土地是有人管理的,会进行回收等自动处理,好比说该区域属于国家,你挂了,土地就回收了;有的区域(堆),是公共的,谁都可以用,也没人管理,你只享用某一块空间,却不管清理该空间的废物垃圾,等你挂了,就会影响该空间的再次使用。

当然这也是计算机系统的机制问题,在某些case下某空间无人占领,就该清除,当然也不保证你私藏的电影会不会被清除。


回到主题,为啥内存浪费,该有点头绪了吧,就是没人处理呗。

经常会有人讲,block中使用self会产生循环引用。

他告诉你了规则,那为何产生循环应用?循环引用又咋了?

在下才疏学浅,也是通过查看其他猿友的文章。

http://www.cnblogs.com/biosli/archive/2013/05/29/iOS_Objective-C_Block.html

http://www.cnblogs.com/flyFreeZn/p/4264220.html

我们会想,对象都分配到栈中,就有人管理了,不会有内存泄露的问题了,寡人只想告诉你,有想法是好的,还得按规矩来,哪种case下的对象,在哪里分配空间,是系统决定的。

通过其他猿友的,总结就是ARC下,就是以下两条准则来理解为啥循环依赖、为啥内存常驻了,

声明一个block对象,它是在栈中的;如果Block作为属性property,默认是strong修饰的,我们也会用copy来修饰,两种修饰,都会将Block对象 copy到堆(无人管地带)上。


那么常见问题来了,结合iOS的内存管理机制(引用计数),思路也就有了。

1、临时定义的block,不是copy、strong出来的,如果使用self,不会循环依赖。

为啥咧?因为block中的任务结束(走完{...}),他也就会被处理干净了,相关变量,也会清除,最主要,它在栈中,不信你试试。

当然某些case下,会延迟释放self,比如某个UIViewController的对象中,你在dissmiss页面前,使用performAfter 、dispatch_after来提交了一个任务块(block),里面使用了self,就会延迟释放self,看个人意愿吧,我一般在这种case下,都使用weak,来减少不必要的任务处理。

2、属性block对象中,使用self,会循环依赖,导致self不自动释放,导致内存浪费

为啥咧?因为block此时在堆中,对象self和对象block相互持有对方,导致彼此至少引用计数都是1,tm的谁也没法释放,此时最想说,真是不怕神一样的对手,就怕猪一样的队友。

相关文章

  • iOS 中内存泄露 - Block就会循环依赖?

    Hi, 本文主讲,Block中使用self,为何会循环依赖。 最近公司对代码质量很在意,这是好事。 我们使用Cov...

  • iOS 内存泄露监测

    iOS可能存在的内存泄露: block 循环引用。当一个对象有一个block属性,而block属性又引用这个对象本...

  • iOS 性能优化

    列举在项目开发中可能遇到的优化点 1、内存泄露检测可能出现内存泄露的地方:循环引用,block强引用,NSTime...

  • iOS 底层 day29 循环引用 和 内存泄露

    一、UIView 的 block 写动画 1. 请问下面代码有内存泄露吗?有循环引用吗? 没有内存泄露,也没有循环...

  • iOS - 性能优化

    内存方面 检测内存泄露 block使用上的强强循环导致页面不释放 :规范block使用,避免循环不释放 创建很多临...

  • 常见内存泄露

    一, 常见内存泄露种类 block 循环引用 及 delegate 的强引用.单例对 block 进行了 copy...

  • iOS复习之Block

    iOS面试中如何优雅回答Block iOS block循环引用

  • 【Tips】 拒绝循环引用

    前言 最近项目中检查是否有内存泄露,发现大部分的情况都是由于block的循环引用而导致的内存泄露,所以借此机会来记...

  • block的循环引用 你知道多少

    众所周知,在block中的对象引用 要用__weak,比如 上述做法会循环应用 造成内存泄露,需要写成 这样就不会...

  • 关于Block内部要不要使用weakSelf的几种情况

    我们知道当对block使用不当时会造成循环引用导致内存泄露,这里列出几种使用block到底会不会引起循环引用的例子...

网友评论

    本文标题:iOS 中内存泄露 - Block就会循环依赖?

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