引用计数
概念:每个对象有一个与之相关联的整数,称作它的引用计数器或保留计数器。
方法:
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,同时还要避免使用创建自动释放对象的便利函数。