zoukankan      html  css  js  c++  java
  • 谈谈ios内存管理--持续更新

      本文主要谈谈ios内存管理的发展脉络,不足之处,还请指教,相互学习交流。做ios开发,永远无法避开内存管理,无论我们是否有意识去考虑这个事情,但是只要我们写了OC程序,那么就与内存管理有关。

      一、内存管理是做什么的?

      二、内存管理方式一:MRC

       (一)引用计数器

       (二)原则

       (三)alloc、new、copy、mutableCopy、retain、release、dealloc

          alloc内部实现

          引用计数表

       (四)autorelease

      三、内存管理方式二:ARC

      (一)__strong

      (二)__weak 和__unsafe_unretained

      (三)__autoreleaseing

      (四)

    一、内存管理是做什么的?

      内存管理,就是对内存进行管理。先看一个情况:我们用代码创建了一个对象A,对应会分配一块内存空间给它,使用完了对象A,就和系统说一声,系统接到通知,收回内存空间。理当如此。但是,当使用对象A的人不止一个,张三先用完了,李四还在用,张三此时通知系统,“我不用对象A了”,系统接到通知,收回内存空间,还在使用对象A的李四就不能用了(野指针),求李四心里阴影面积。。。为了解决这个问题,苹果官方引入“引用计数器”,引用计数器用来记录当前有多少“人”在使用某个对象,那么收回内存空间的判断标准就变成了——引用计数器的值是0。有一个人开始用对象,该对象的引用计数器就+1,不用了,就-1。这就解决了上述多人使用同一个对象时的内存管理问题。

      那么,内存管理的问题,就集中到了引用计数器的管理上来。

    二、内存管理方式一:MRC    

     (一)手动内存管理的思考方式

        大家都知道,MRC是手动管理引用计数模式。在MRC下,OC的内存管理思方式:

        1、自己生成的对象,自己持有;

        2、非自己生成的对象,自己也能持有;

        3、自己不再使用的对象,释放;

        4、非自己持有的对象无法释放。(野指针,比如只有一个pool,但连续用了两次autorelease方法)

        解释一下:持有的意思是retain,让计数器+1,释放的意思是release,让计数器-1。

     (二)alloc、new、copy、mutableCopy、dealloc

        使用alloc、new、copy、mutableCopy得到的对象,不用的时候,要release。调用release方法的时候,内部会判断,如果计数器release之后,计数器为0时,调用对象的dealloc方法,废除(回收、释放)内存空间。

     (三)autorelease

       简单说,在autoreleasepool中调用对象A的autorelease方法,就是使用对象A,但不retain,引用计数器不+1,将对象A添加到自动释放池的一个数组array中,相当于注册登记了一下。等自动释放池drain的时候,会调用自动释放池的dealloc方法,delloc方法调用另一个方法,遍历取出数组array中的对象,并执行对象的release方法。

    三、内存管理方式二:ARC

      后来,苹果官方引入了ARC模式,大家解放了很多,因为不用再写retain、release等代码来管理内存了。只要用对应的修饰符来修饰指向对象内存空间的指针,系统就会自动为我们管理内存。

     (一)__strong

     (二)__weak 和__unsafe_unretained

     (三)__autoreleaseing

      (四)

  • 相关阅读:
    C++中获取高精度时间差
    有关宏的一个问题
    HDU 2504 又见GCD
    .NET中统一的存储过程调用方法(收藏)
    如何让你的SQL运行得更快
    最赚钱的5种成功创业可行方式
    SQL语句优化技术分析
    js document.getElementByID("aa")的位置
    写SQL时尽量不要对字段进行运算操作
    连接池的问题
  • 原文地址:https://www.cnblogs.com/panyuluoye/p/4943823.html
Copyright © 2011-2022 走看看