level 12
蓝鸥iOS开发者
楼主
近来,有同学经常问关于内存管理的问题,今天,简单跟大家说说。iOS开发的内存管理原则,虽然开发的APP都是小巧的应用,但是由于硬件空间上的局限性,如果不对内存好好管理的话,还是会出很多问题的。特别是之前习惯了垃圾回收机制的Java程序员,要尤其注意这个问题。其实,iPhone系统中的Objective-C的内存管理机制是比较灵活的,我们既可以拿来像C/C++一样用,也可以加个AutoreleasePool让它升级为半自动化的内存管理语言。

引用计数是实例对象的内存回收唯一参考
引用计数(retainCount)是Objective-C管理对象引用的唯一依据。调用实例的release方法后,此属性减一,减到为零时对象的dealloc方法被自动调用,进行内存回收操作,也就是说我们永远不该手动调用对象的dealloc方法。
1、分配内存
l alloc
Objective-C 创建对象分为alloc和init两步,alloc 是在堆(heap)上初始化内存给对象变量,把变量(指针)设为 nil,如果是基本数据类型如int,则初始值为0。每个类可以很多 init 方法,且每个方法都以 init 开头,但每个类只有一个特定(designated)的 init 方法,NSObject 是 init;,UIView 是 - (id)initWithFrame:(CGRect)aRect;。在子类的 designated 方法中一定要调用父类的 designated 方法,子类其他的 init 方法只能调用子类自己的 designated 方法,不能调用父类的(即使用 self 而不是 super)。
alloc创建新对象,其引用计数retainCount的值初始化为1
l retain
保留对象的所有权,作用只有一个retainCount加1
l copy
复制一个对象,所得到的对象是新对象,独立的对象(干净对象)。
retainCount的值两种情况
1. 非mutable对象如(NSString,NSArray)操作同retain. retainCount的值加1
2. mutable对象如(NSMutableString,NSMutableArray)返回一个新对象,新对象的retainCount 值为1
2、释放内存
l 当使用 new、alloc 或 copy 创建对象时,对象的 retainCount 为 1。你一定要负责把这个对象 release 或 autolease 掉。这样当它的生命周期结束时,它才能清空。
l release的作用是retainCount减1,当retainCount的值减到0时自动调用dealloc方分法
l autoRelease的作用是将调用的对象加的自动释放池NSAutoReleasePool中,当池释放时自动调用对象的release方法.
l 当使用其他方法获得一个对象时,你可以认为它已经 retainCount加1,并且 autolease 掉了。你不用考虑和它相关的清理问题。但是如果你想保留这个对象,那么你需要 retain 它,并且要确保之后你 release 了这个对象。
l 如果你 retain 一个对象,你最终总是需要 release 或者 autolease 它。
Objective-C内存管理总结:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSObject *o = [[NSObject alloc] init]; //retainCount为1
[o retain]; //retainCount为2
[o release]; //retainCount为1
[o autorelease]; //retainCount为1
[pool release]; //retaincount为0,触发dealloc方法
现在,我们可以简单的总结一下Objective-C内存管理准则。我们可以把接口按对retainCount的操作性质归为两类:
A类是加一操作:alloc,retain,copy;还有就是B类是减一操作:release,autoRelease(延时释放)。
Objective-C内存管理准则是A与B类的调用次数保持一制。还有就是为了很好的保障准则一,以实例对象为单位,谁A了就谁B,没有第二者参与。
Objective-C使用了一种叫做持有计数(Retain Count)的机制来管理内存中的对象。
在 Objective-C中每个对象都对应着他们自己的持有计数(Retain Count),持有计数可以理解为一个整数计数器,当使用alloc方法创建对象的时候,持有计数会自动设置为1。当你向一个对象发送retain消息 时,持有计数数值会增加。相反,当你像一个对象发送release消息时,持有计数数值会减小。当对象的持有计数变为0的时候,对象会释放自己所占用的内存。
2013年02月26日 06点02分
1

引用计数是实例对象的内存回收唯一参考引用计数(retainCount)是Objective-C管理对象引用的唯一依据。调用实例的release方法后,此属性减一,减到为零时对象的dealloc方法被自动调用,进行内存回收操作,也就是说我们永远不该手动调用对象的dealloc方法。
1、分配内存
l alloc
Objective-C 创建对象分为alloc和init两步,alloc 是在堆(heap)上初始化内存给对象变量,把变量(指针)设为 nil,如果是基本数据类型如int,则初始值为0。每个类可以很多 init 方法,且每个方法都以 init 开头,但每个类只有一个特定(designated)的 init 方法,NSObject 是 init;,UIView 是 - (id)initWithFrame:(CGRect)aRect;。在子类的 designated 方法中一定要调用父类的 designated 方法,子类其他的 init 方法只能调用子类自己的 designated 方法,不能调用父类的(即使用 self 而不是 super)。
alloc创建新对象,其引用计数retainCount的值初始化为1
l retain
保留对象的所有权,作用只有一个retainCount加1
l copy
复制一个对象,所得到的对象是新对象,独立的对象(干净对象)。
retainCount的值两种情况
1. 非mutable对象如(NSString,NSArray)操作同retain. retainCount的值加1
2. mutable对象如(NSMutableString,NSMutableArray)返回一个新对象,新对象的retainCount 值为1
2、释放内存
l 当使用 new、alloc 或 copy 创建对象时,对象的 retainCount 为 1。你一定要负责把这个对象 release 或 autolease 掉。这样当它的生命周期结束时,它才能清空。
l release的作用是retainCount减1,当retainCount的值减到0时自动调用dealloc方分法
l autoRelease的作用是将调用的对象加的自动释放池NSAutoReleasePool中,当池释放时自动调用对象的release方法.
l 当使用其他方法获得一个对象时,你可以认为它已经 retainCount加1,并且 autolease 掉了。你不用考虑和它相关的清理问题。但是如果你想保留这个对象,那么你需要 retain 它,并且要确保之后你 release 了这个对象。
l 如果你 retain 一个对象,你最终总是需要 release 或者 autolease 它。
Objective-C内存管理总结:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSObject *o = [[NSObject alloc] init]; //retainCount为1
[o retain]; //retainCount为2
[o release]; //retainCount为1
[o autorelease]; //retainCount为1
[pool release]; //retaincount为0,触发dealloc方法
现在,我们可以简单的总结一下Objective-C内存管理准则。我们可以把接口按对retainCount的操作性质归为两类:
A类是加一操作:alloc,retain,copy;还有就是B类是减一操作:release,autoRelease(延时释放)。
Objective-C内存管理准则是A与B类的调用次数保持一制。还有就是为了很好的保障准则一,以实例对象为单位,谁A了就谁B,没有第二者参与。
Objective-C使用了一种叫做持有计数(Retain Count)的机制来管理内存中的对象。
在 Objective-C中每个对象都对应着他们自己的持有计数(Retain Count),持有计数可以理解为一个整数计数器,当使用alloc方法创建对象的时候,持有计数会自动设置为1。当你向一个对象发送retain消息 时,持有计数数值会增加。相反,当你像一个对象发送release消息时,持有计数数值会减小。当对象的持有计数变为0的时候,对象会释放自己所占用的内存。