我有两个类,一个处理数据库连接的类和一个实体类。 db类有一个名为GetEntityByID的实例方法:(int)entity_id。此方法执行简单的select语句,并使用init方法创建Entity类实例。
这很好用,但是调用GetEntityByID的人必须记得发布它。由于GetEntityByID不是“init”方法,因此这似乎不正确。在这种情况下,如何最好地处理内存管理?
答案 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内存管理。