美文网首页
理解内存管理

理解内存管理

作者: David_Cap | 来源:发表于2015-09-15 16:34 被阅读46次

引用计数简介

引用计数可以有效的管理对象的生命周期。当我们创建一个对象的时候,它的引用计数为1。当有一个新的指针指向这个对象的时候,引用计数加1。当某个指针不再指向这个对象时,引用计数减1。当对象的引用计数变为0的时候,就说明这个对象没有被任何人牵着,那么就会被释放。

引用计数示意

为什么需要引用计数

首先 我们来介绍一下 内存管理的原则,谁申请谁释放。谁是孩子他爹,那么就该谁来管理这个熊孩子(当然姓王例外)。

下面 我们再来举个例子来看看为什么需要引用计数。

例如对象A 拥有一个对象M。突然A觉得要要调用一下B的某个方法并把M对象作为参数传递过去。那么B可能是把传递过来的M当成临时变量,又可能觉得很重要当成成员变量。那么我A该怎么办,我A释放了M,那么你B不是就扑了个空(M就变成了nil)。

引用计数1

这个时候人们就会想到了2种解决方法。

  1. 在A调用完之后B方法之后马上释放M,然后再对象B中再拷贝一份M2给B自己管理。

    看似很聪明的解决办法,会带来很大的问题。那就是运行效率严重下降,因为没一次调用方法都要申请,复制,释放。这些都是一些耗时操作。本来一个可以复用的对象,却因为不方便管理它的生命周期,就这样简单的销毁,又重新申请,实在浪费。
引用计数2
  1. 第二种方法就是,A你不用管M什么时候释放啦,你把M这个熊孩子交给B,B用完了自然会消耗的啦。这样又造成了一个问题,就是使内存管理10分混乱,没有按照原则来。

所以引用计数就很好的解决了这个问题,A调用完B的某方法的时候,M的引用计数+1变成2。调用完B的某方法后直接释放,M就变成1。然后再在B中用完了释放一次变成0。完美解决。

循环引用问题

这个问题之前总结过: 循环应用参考博客

这里再总结一下吧,再ARC中,循环引用只要稍微注意一点还是很好避免的。

主要注意以下俩点:

  1. 所有 Delegate 一律用weak。
  2. 再所有 Block 中,Self 都用 weakSelf。

使用Leak检测循环引用

Leak是Xcode自带的一个内存泄漏的检验工具。

开启什么的相信不用多说。

运行程序的时候发现如下情况就表示你的程序有内存泄漏,很可能就是循环引用的问题。

Leak

相关文章

  • 内存管理

    ARC内存管理机制详解理解 iOS 的内存管理

  • 《Effective Objective-C 2.0》读书笔记(

    第五章 内存管理 第29条:理解引用计数 OC 中有手动内存管理(MRC) 自动内存管理(ARC)手动内存管理需要...

  • 内存管理篇,RunLoop

    iOS内存管理 RunLoop理解

  • Android性能优化-内存泄漏的几个案例

    JVM内存管理 Java采用GC进行内存管理。深入的JVM内存管理知识,推荐《深入理解Java虚拟机》。 关于内存...

  • 理解内存管理

    • 堆和栈 内存泄露、野指针 堆和栈是逻辑分区也是物理分区。Stack Overflow,堆栈溢出是一起溢出的。堆...

  • 理解内存管理

    引用计数简介 引用计数可以有效的管理对象的生命周期。当我们创建一个对象的时候,它的引用计数为1。当有一个新的指针指...

  • 编写高质量的代码

    内存管理 理解内存和Objective-C内存管理规则 内存管理,曾经是程序猿/媛们的噩梦,特别是在面向过程中。虽...

  • 内存管理面试题

    讲一下 iOS 内存管理的理解 讲一下 iOS 内存管理的理解实现原理 内存中的5大区分别是什么? ARC 的 r...

  • 基本知识摘录

    一:内存管理的理解首先iOS中数据是存贮在堆和栈中的。内存管理需要管理堆上的内存,栈上的内存并不需要我们管理。非O...

  • 第8章 理解内存

    理解Redis内存消耗,管理和优化。 1. 内存消耗 1.1 内存使用统计 通过info memory命令获取内存...

网友评论

      本文标题:理解内存管理

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