<A href="http://www.goodprogrammer.org/" target="blank">ios培训</A>------我的objective-c笔记,期待与您交流!
内存管理,是指软件在运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效、快速地分配,并且在适当的时候释放和回收内存资源。本章主要介绍基础的内存管理、引用计数和垃圾回收等相关方面的知识。
一·内存管理的基础
内存管理主要是内存空间的申请和释放。当我们申请的内存空间使用后一定要释放,否则,其他的数据不能使用这块空间就会造成资源的浪费。主要介绍两个基本的内存管理:申请内存和对内存的释放。
1·申请内存alloc称为申请内存。它的功能是为内存分配空间。
2·释放内存
当我们对申请的内存空间使用完成后,一定要把这块空间释放。释放内存主要分为两种:手动释放和自动释放。
1)手动释放
release是内存释放中的手动释放
调用形式为[对象名 release]
2)自动释放
形式为[[对象名 alloc]autorelease]
二·引用计数
retain为+1.release为-1.
1.引用计数和字符串
如果alloc和copy了一个字符串,在方法结束时需要用release或者autorelease这个字符串。当使用alloc()、copy()、release()、utorelease()的时候,字符串的引用计数也会发生改变。
2.引用计数和实例变量
我们在处理实例变量时,必须要注意实例变量的引用计数。当使用retain和copy时实例变量的引用计数加1。
三·自动释放池
自动释放池(Autorelease pool)是Objective-C的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放。主要介绍自动释放池和它与引用计数之间的关系。
1.自动释放池
通过autorelease自动释放的功能,Objective-C有了以一种自动释放池的形式将其内存释放。
autorelease{
}
由于我们对ARC设置的不同自动释放池的形式也是不同的。当将默认的Objective-C Automatic Reference Counting设置为NO时,释放池的使用形式就会发生改变。
释放池的名字用户可以进行自定义的,默认为pool。在使用完释放池以后必须要有释放语句,默认为“pooldrain”
2.建立多个自动释放池
当我们建立了多个释放池后,如果不使用了,就要使用“pool drain”语句将其释放。最好是减池的个数和释放池的个数相等。
3.引用计数和自动释放池
我们要想将类中的对象放到释放池中,必须使用autorelease,对象才可以被放入自动释放池中
[对象名 autorelease]
首先我们对没放入自动释放池的对象使用“pooldrain”释放,对象的引用计数没有变化的。当我们将对象放入自动释放池以后再使用语句“pool drain”,对象的引用计数就会减1。
四·内存管理规则及内存泄漏
所谓内存管理规则就是在内存中要遵守的一系列规则,我们必须牢牢遵守,才不会使资源遭到不必要的浪费。
1·使用规定的方法创建对象
当使用new()、alloc()、copy()方法创建一个对象时,该对象的保留计数器值为1。当不再使用该对象时,开发人员要负责向该对象发送一条release或autorelease消息。这样,该对象将在其使用寿命结束时被销毁。
2·其他方法创建对象
当通过其他方法获得一个对象时,假设该对象的保留计数器值为1,而且已经被设置为自动释放,开发人员不需要执行任何操作来确保该对象被清理。如果你打算在一段时间内拥有该对象,这需要保留它并确保在操作完成时释放它。
3·保持一致
在一定的代码段中,使用copy(),alloc()和retain()的次数应该和release(),autorelease()保持一致。
4·内存泄漏
当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,那么对于该进程来说,会因此导致总可用内存的减少,这时就出现了内存泄漏。内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。