美文网首页
内存泄漏与循环引用

内存泄漏与循环引用

作者: 落叶兮兮 | 来源:发表于2020-07-27 17:58 被阅读0次

在iOS开发中,内存泄漏是让开发者比较头疼的一件事。虽然ARC可以帮助开发者解决大部分的内存管理问题,但其对内存泄漏依旧束手无策。

内存泄漏的核心问题是循环引用。什么是循环引用?在Objective-C设计中,对象会对其内的属性进行持有,当一个对象的引用计数为0,将其内存回收时,这个对象会向其中所有的属性发送release消息,让其中的属性对象进行释放。

对象对其中属性的持有关系

如果对象内的某个属性再次对当前对象进行了持有,则会产生循环引用,因为对象只有在引用计数降为0时,才会向其内的属性发送release消息。同样,只有其内属性接收到了release消息时,才会对它们所持有的所有对象进行了释放,当前对象的引用计数才有可能降为0,此时就产生了循环引用。


循环引用示例图

在开发中,引起循环引用的情况主要是以下三种情况:

block与循环引用

下面的代码就会产生循环引用

self.myBlock = ^BOOL(int param) {
       NSLog(@"%@",self);
       return YES;
}

在Block中使用外部的对象时,都会对对象进行一次强引用,因此上面的代码会产生循环引用。因为myBlock是当前类中的属性,所以当前类对象会对myBlock有强引用,只有当当前类对象引用计数被降为0时,才会对myBlock发送release消息,同样,由于在myBlock内部使用到了self关键字,使得myBlock又对当前类对象进行了强引用,当前类对象要想释放,必须等myBlock对象的引用计数降为0,这就产生了内存泄漏。
解决办法就是在block中使用弱引用的指针即可。

__weak typeof(self) __self = self;
self.myBlock = ^BOOL(int param) {
       NSLog(@"%@",__self);
       return YES;
}

代理与循环引用

这个delegate的属性设置为strong时就会产生,解决办法就是将其设置为weak,这也是为什么我们使用delegate时使用weak修饰的原因,就是为了避免循环引用

相关文章

  • NSTimer,NSRunLoop,autoreleasepoo

    引言 NSTimer内存泄漏真的是因为vc与timer循环引用吗?不是! 小伙伴们都知道,循环引用会造成内存泄漏,...

  • iOS内存优化

    引起内存泄漏的原因 引起内存泄漏的原因主要有三类,如下 循环引用 强引用 非OC对象 1、循环引用。最简单的循环引...

  • IOS循环引用、内存泄漏、野指针

    一、循环引用和内存泄漏 1、block循环引用 分析:因为WGBlockTestViewController强引用...

  • 内存泄漏与循环引用

    在iOS开发中,内存泄漏是让开发者比较头疼的一件事。虽然ARC可以帮助开发者解决大部分的内存管理问题,但其对内存泄...

  • Xcode调试工具

    一.静态内存分析工具 编译阶段查找内存泄漏等问题 1.常见内存泄漏问题 常见的内存泄漏除了循环引用,CoreFou...

  • ios学记0016-循环引用问题的解决方法

    Block,NSTimer循环引用问题的解决方法 摘要:NSTimer, Block, 循环引用, 内存泄漏 注:...

  • block的循环引用

    什么是循环引用呢? 就是我引用你,你引用我,就会造成循环引用,双方都不会被销毁,导致内存泄漏。 _block = ...

  • Controller销毁NSTimer释放的细节

    关于NSTimer释放和内存泄漏的问题。 @(NSTimer)[内存管理,NSTimer释放,循环引用] 首先需要...

  • iOS 内存优化

    1. 避免内存泄漏 ① 避免对象之间循环引用(代理一定要弱引用)② block 中对象的循环引用、添加的通知在销毁...

  • iOS内存管理

    使用CADisplayLink、NSTimer有什么注意点? 注意内存泄漏、循环引用的问题(self弱引用time...

网友评论

      本文标题:内存泄漏与循环引用

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