在这种情况下如何处理内存管理?

时间:2009-06-20 18:59:46

标签: objective-c memory-management autorelease

我有两个类,一个处理数据库连接的类和一个实体类。 db类有一个名为GetEntityByID的实例方法:(int)entity_id。此方法执行简单的select语句,并使用init方法创建Entity类实例。

这很好用,但是调用GetEntityByID的人必须记得发布它。由于GetEntityByID不是“init”方法,因此这似乎不正确。在这种情况下,如何最好地处理内存管理?

2 个答案:

答案 0 :(得分:5)

如果没有另外保留,您可以在类的autorelease方法中调用GetEntityID来自动释放实例。

由于类的实例化是在数据库连接类的方法中完成的,因此返回实例的对象并不“拥有”它 - 您的数据库连接类。因此,根据convention,您需要内存管理实例:

  

如果使用名称以“alloc”或“new”开头或包含“copy”(例如,alloc,newObject或mutableCopy)的方法创建对象,或者如果发送它,则获取对象的所有权保留信息。您有责任使用release或autorelease放弃您拥有的对象的所有权。在收到对象的任何其他时间,您都不能释放它。

如果发送GetEntityID方法的对象想要保留对象,例如,如果要将其用作实例变量,则可以保留返回的对象,从而防止它在最后被释放当前的事件。如果仅在本地使用,并且在当前事件之后不需要保留,那么该课程不必做任何事情;它将在当前事件结束时由自动释放池释放。

This article详细介绍了自动释放池。

答案 1 :(得分:0)

要自动释放GetEntityID中返回的对象,请在GetEntityID中执行以下操作:

...  // cool stuff in GetEntityID
return [[entity_id retain] autorelease];
}

详细了解这个nice article更详细地解释Objective-C内存管理。