cocoa是引用计数
alloc, new, copy生成对象时,引用计数会+1。
如果要增加对象的引用计数,发送retain消息。
如果要减少对象的引用计数,发送release消息。
当对象的引用计数为0时,将自动发送dealloc消息
最佳实践:先保留新对象,然后释放旧对象
-(void) setEngine: (Engine *) newEngine
{
[newEngine retain];
[engine release];
engine = newEngine;
}
自动释放池:
当给一个对象发送autorelease消息的时候,实际上是把该对象加入自动释放池。当自动释放池被销毁时,会向该池中所有对象发送release消息。
有两种方法可以创建一个自动释放池:
通过@autoreleasepool关键字:
@autoreleasepool {}
通过NSAutoreleasePool对象:
NSAutoreleasePool *pool;
pool = [NSAutoreleasePool new];
…
[pool release];
内存管理规则:
1. 当你使用new, alloc或者copy方法创建一个对象时,该对象的保留计数的值为1.当不再使用该对象时,你应该向该对象发送一条release或者autorelease消息。这样,该对象将在使用寿命结束时被销毁。
2. 当你通过其他方法获得一个对象时,假设该对象的保留计数值为1,而且已经被设置为自动释放,那么你不需要执行任何操作来确保该对象得到清理。如果你打算在一段时间内拥有该对象,则需要retain它并确保在操作完成时释放它。
3. 如果你retain某个对象,就需要最终释放或者自动释放该对象。必须保持retain方法和release方法使用次数相等。