objective-c笔记:内存管理

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方法使用次数相等。