objective-c 笔记3:内存管理

引用计数

概念:每个对象有一个与之相关联的整数,称作它的引用计数器保留计数器

方法:

retain:对象的引用计数器加1.

release:对象的引用计数器减1.

dealloc:释放对象。

autorelease: 自动释放。

规则:

1.当使用new、alloc、copy方法创建一个对象时(拥有对象),该对象的引用计数器值为1.当不再使用该对象时,你要负责向该对象发送一条release或autorelease消息。这样,该对象再其使用寿命结束时被销毁。

销毁方法:dealloc

eg:

-(void) doStuff
{
 flonkArray = [NSMutableArray new];// count:1

}

-(void) dealloc
{
 [flonkArray release];// count:0
 [super dealloc];
}
 

2.当你通过任何其他方法获得一个对象时(临时对象),则假设该对象的保留计数器值为1,而且已经设置为自动释放,你不需要执行任何操作来确保该对象被清理。如果打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它。

eg:arrayWithCapacity 方法,不需要关心如何销毁该对象。

-(void) doStuff
{
  flonkArray = [NSMutableArray arraywithCapacity:17];//临时对象
  //count:1  是autoreleased
  [flonkArray retain];// count:2, 1:是autorelease
 
}

-(void) dealloc
{
 [flonkArray release];// count:0 (本来是2个计数器,但是有一个计数器为autorelease)
 [super dealloc];
}
 

3.如果你保留了某个对象,你需要释放或自动释放该对象。必须报纸retain方法河release方法的使用次数相等。

清理自动释放池:

NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
int i;
for(i=0;i<100000000;i++)
{
id object = [someArray objectAtIndex:i];
NSString *desc = [object descrption];

if(i % 1000 == 0)
[pool release];
pool = [[NSAutoreleasePool alloc] init];

}

[pool release];
 

垃圾回收:

Objective-c 2.0   引入了自动内存管理机制,也称作垃圾回收。

启用垃圾回收非常简单,只是一种可供选择的功能。选项:“-fobjc-gc”

在对象实例变量使用结束时,一定要赋值为:nil,以取消对该对象的引用并使垃圾回收器知道该对象可以被清理了。

注意:开发iPhone软件不能使用垃圾回收。建议不要在自己的代码中使用autorelease,同时还要避免使用创建自动释放对象的便利函数。

猜你喜欢

转载自labuladuo.iteye.com/blog/1766907