1.内存管理概述
1.1什么是内存管理:内存管理是程序设计中常用的资源管理的一部分,每个计算机系统可供程序使用的内存都是有限的。
1.2为什么要使用内存管理:当我们的程序运行结束的时候,操作系统将回收其我们程序占用内存。但是,只要程序还在运行,它就会一直占用内存。如果不进行及时清理不用的内存,内存最终将被耗尽。每个程序都会使用内存,我们必须确保在需要的时候分配内存,而在程序运行结束时释放占用的内存。如果我们只分配而不释放内存,将发生内存泄漏。
1.3引用计数:
1.3.1只有当你对一个对象了alloc,copy或retain等操作以后,你才拥有它的引用。
1.3.2当你不需要这个对象时,你应当释放你对他的引用。
1.3.3你不可以对你没有引用的对象执行释放操作。
IOS一旦出现内存不足的情况,ios平台会通知所有已经运行的APP,不论是前台APP还是后台挂起的APP,都会收到 memory warning 的notice 一旦APP收到 memory waring 的 notice 就应该回收占用内存较大的变量。
1.4 内存警报处理:
1、程序收到系统发来 memory waring
2、程序释放占用较大的内存。
3、系统回收此程序所创建的atutorelease的对象。
2.内存管理
2.1手工引用计数和自动释放池
手工管理内存的范围:任何继承了NSObject 的对象,并且使用了alloc、copy、mutableCopy和New为前缀的方法创建的对象都不会被自动释放,则需要进行手动管理。
引用计数:对象被创建的时候默认带有4个自己的引用计数器,并且默认的值为1,当引用计数的值为0的时候,对象将被系统销毁。
获取引用计数:给对象发送 retainCount消息获得当前的引用计数,返回值是无符号长整型,可以使用如下语句打印:
NSLog(@“%zi”,[person retainCount]);
获得引用:
alloc:为一个新对象分配内存,并将它的引用计数置为1.调用alloc方法你便拥有了新对象的所有权。
retain:是对象的引用计数+1,并获得对象的引用。
释放引用:
release:是对象的引用计数减1。
autorelease:是对象的引用计数在未来的某个时候减1,而当前引用计数并没有变。
当引用计数为0的时候,系统则会自动调用继承自NSObject的 dealloc 方法,释放所内存,然后为了能够释放由对象创建或保持的实例变量或者其他对象,需要复写Dealloc方法,但是不建议直接调用dealloc方法,因为这个是由系统进行调用的。
内存管理原则:
*谁创建,谁释放,如果你通过alloc、new或copy来创建一个对象,那么你必须调用release或autorelease。
*一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。
*谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。