Object-c的内存管理是使用引用计数,来监测对象是否还在被使用,当不被使用的时候,释放内存。 objective-c
关于引用计数retaincount,当使用alloc方法进行内存分配建立对象时,对象就有了一个引用计数,并且retaincount=1。以后,正在运行的应用程序能够在多个位置引用该对象,或者对象可能存储在一个数组中,也可能被其余位置的实例变量引用,只有在肯定使用该对象的每一个人都使用完后,才能释放它所占用的内存。每一次使用该对象,好比添加到数组中,使其引用计数加1;或者也能够手动保持该对象,就是本身调用ratain消息,[myObject retain]。不须要对象时,发动release消息,使对象引用计数减1。当对象的引用次数达到0时,系统指导再也不须要这个对象(由于理论上它再也不被引用),所以系统就会释放它的内存。 数组
代码示例: spa
#import <Foundation/NSObject.h> 设计
#import <Foundation/NSAutoreleasePool.h> 指针
#import <Foundation/NSString.h> orm
#import <Foundation/NSArray.h> 对象
#import <Foundation/NSValue.h> 内存
Int main(int argc,char *argv[]) rem
{ 文档
NSAutoreleasePool *pool=[[NSAutorelease alloc]init];
NSNumber *myInt=[NSNumber numberWithInteger:100];
NSNumber *myInt2;
NSMutableArray *myArr=[NSMutableArray array];
NSLog(@”myInt retain count=%lx”,(unsigned long)[myInt retainCount]);
//调用retainCount返回的是一个NSUInteger类型的无符号整数
[myArr addObject:myInt];
NSLog(@”after adding to array=%lx”,(unsigned long)[myInt retainCount]);
myInt2=myInt;
NSLog(@”after asssignment to myInt2=%lx”,(unsigned long)[myInt retainCount]);
[myInt retain];
NSLog(@”myInt after retain=%lx”,(unsigned long)[myInt retainCount]);
NSLog(@”myInt2 after retain=%lx”,(unsigned long)[myInt2 retainCount]);
[myInt release];
NSLog(@”after release=%lx”,(unsigned long)[myInt retainCount]);
[myArr removeObjectAtIndex:0];
NSLog(@”after removal from array=%lx”,(unsigned long)[myInt retainCount]);
[pool drain];
Return 0;
}
输出结果:
myInt retain count=1
after adding to array=2
after asssignment to myInt2=2
myInt after retain=3
myInt2 after retain=3
after release=2
after removal from array=1
检查addObject方法的文档,将发现,将对象添加到任何类型的集合都会使该对象的引用次数增长。这就意味着,若是随后释放了添加的添加对象,那么数组中仍然存在着该对象的有效引用,而且对象不会被释放。
代码中将myInt赋值给变量myInt2,要注意这个操做并无使myInt对象的引用次数增长,这可能会在之后形成潜在的麻烦。例如若是对myInt的引用次数减小到0,而且它占用的空间被释放,那么myInt2将拥有无效的对象引用(将myInt赋值给myInt2的操做并无复制实际的对象,只是指向myInt在内存中位置的指针)。由于多了一个队myInt对象的引用,为保持引用计数的同步,因此经过发送retain消息来同步引用计数。
因此,在示例中,一共有3次对myInt的引用,第一个是实际的对象自己,即建立对象,第二个是数组中的引用,第三个来自赋值引用。其中,添加对象到数组中会引发引用计数增长,可是赋值操做却不会。
整理摘自《objective-c 2.0程序设计》