关于引用计数

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程序设计》

相关文章
相关标签/搜索