转:http://blog.csdn.net/jeepxiaozi/article/details/8821747
今天是学习IOS开发的第六天,那么因为看的比较快,所以现在应该到了IOS开发中的重中之重了,那就是内存管理。
Obj-C中的内存管理不同于C语言式的完全手动管理方式,malloc和free操控内存,也不同于GC语言(例如java&ruby等)的自动回收方式,在Obj-C中的内存管理方式采用的是比较折中的方式,也就是手动和半自动结合,采用自动对象释放池进行自动管理或者采用引用计数值进行手动管理。
1. 引用计数值
至于为什么要进行内存管理,这里我想大家应该基本了解了,即使我这种不太了解底层的码畜都知道一些,那么内存管理就是CPU内存资源的分配和回收,良好的内存管理机制在于尽量控制CPU内存资源的浪费。
Obj-C中语言中引用计数值的管理方式,对象每次alloc1次计数值为1同时获得内存,每retain 1次计数值加1,每release 1次计数值减1,直到计数值为0的时候,对象就会被销毁,主要的操控接口如下:
Alloc、allocWithZone、new(并且初始化)——为对象分配内存,计数值+1,返回实例
Release——计数值-1
Retain——计数值+1
Copy、mutableCopy——复制一个实例,计数值为1,返回实例,所得到的对象是一个全新的对象
Autorelease在当前的上下文的autoreleasePool栈顶添加对象,由于它的引入使Obj-C的内存管理方式由全手动上升为半自动。
那么我们来看一段代码实例,演示下内存的计数值管理
程序的最终输出结果如下:
myInt retain count=1
myInt retain count after retaine=2
myInt retain count after release=1
secInt retain count after copy=1
上述这段代码演示了计数机制是如何工作的,简单的规则就是,alloc和retain会让对象引用计数+1,release会让对象的引用计数-1,而copy对象则是只会将新的对象的引用计数+1,所以简单的规避内存泄露的一个方法就是有多少个alloc和retain,就要有多少个相应的release。
2. 对象释放池
有时候程序代码可能会返回临时变量,Obj-C提供了一种比较优雅的方式,就是延迟释放,即对象自动释放池。
那么今天我们就是先简单的了解下Obj-C的内存管理,其实这个总的来说并不是特别复杂,但是它却是重中之重,起码在我看来,周围已经遇到好些个工程师因为内存泄露的问题导致程序产生比较严重的bug了,那么随着学习的不断深入,我们会对这块儿有更深入的了解和体会。
2013年4月18日,Eric.Tang 记