iOS中的内存管理

来源:互联网 发布:获取数据失败怎么办 编辑:程序博客网 时间:2024/05/16 04:11

要了解内存管理机制, 首先要明白为什么要管理内存,  应用程序出现闪退(Crash)的情况中, 大部分是因为内存的问题, 所以,为了保证应用程序的性能, 必须避免对内存的错误使用, 内存问题主要由两个方面, 内存溢出和野指针

内存溢出: 通俗的讲就是内存不够用,超出了限定的范围

野指针异常: 当一块内存被释放的时候, 还用原来的指针去调用这块内存, 就会造成野指针异常

野指针是程序Crash的主要原因


内存管理的方式分为三种: 垃圾回收机制, MRC管理机制, ARC管理机制

1. 垃圾回收机制: 只需要开辟内存, 不需要用代码来进行释放,系统会自动判断哪些内存空间不再被使用, 自动回收内存空间, 整个过程不需要写任何释放的代码, 由系统自动完成

2. MRC: 手动分配内存空间,手动释放       

     优点: 对内存的管理更加灵活, 再需要释放的时候及时释放,    但对程序员的要求更高

3. ARC:  本质上还是MRC, 只不过是不需要写释放的代码, 编译器会默认加入释放的代码, 并不是垃圾回收机制


iOS中对内存管理的方式为后两种, MRC 和 ARC , 其中: MRC的内存管理机制是引用计数的概念

引用计数:   每分配一段新的内存空间,它的引用计数就加1, 当释放掉这段内存的时候,引用计数就减1

iOS中能引起引用计数改变的操作:

使引用计数+1 :  alloc     retaincopy

使引用计数-1 :  release autorelease(未来某一时刻使引用计数-1)

需要注意的是:

  1.  alloc  和   release 是成对出现的,  在alloc一段内存的时候,在使用完后必须release

2.  将一个对象添加到数组或字典中时, 为了确保数组或字典持有这个对象,  它所指向的内存空间的引用计数会+1, 相应的, 当数组或字典的引用计数变为0的时候, 它里面的对象的引用计数也会相应的-1


自动释放池: 

当一个对象被加入到自动释放池后,如果自动释放池释放后, 这个对象的引用计数也会-1

在iOS5之后,不再使用NSAutoreleasePool类, 而是以@autoreleasepool{}的方式代替, 需要加入到自动释放池的对象,直接写道大括号里面即可, 出了大括号,引用计数便-1


当一个对象的引用计数变为0, 系统会自动调用dealloc方法, 对内存进行一个回收, 以便下次使用



总结:

 iOS中对内存的管理方式有MRC, ARC两种, 其中:

  1. ARC不需要写释放内存的代码, 编译器会自动添加, 本质上还是MRC;

2. MRC对内存的管理主要是对引用计数的管理, 当一个对象的引用计数变为0,便会对这块内存进行回收, 保证内存的及时释放,及时利用, 管理更加灵活

0 0
原创粉丝点击