我有两个类,一个处理数据库连接的类和一个实体类。db 类有一个名为 GetEntityByID:(int)entity_id 的实例方法。此方法执行一个简单的选择语句,并使用 init 方法创建一个 Entity 类实例。
这很好用,但是调用 GetEntityByID 的人必须记住释放它。由于 GetEntityByID 不是“init”方法,这似乎不对。在这种情况下,我如何最好地处理内存管理?
我有两个类,一个处理数据库连接的类和一个实体类。db 类有一个名为 GetEntityByID:(int)entity_id 的实例方法。此方法执行一个简单的选择语句,并使用 init 方法创建一个 Entity 类实例。
这很好用,但是调用 GetEntityByID 的人必须记住释放它。由于 GetEntityByID 不是“init”方法,这似乎不对。在这种情况下,我如何最好地处理内存管理?
如果实例没有被保留,您可以在类上调用autorelease
您的方法来自动释放实例。GetEntityID
由于类的实例化是在您的数据库连接类的方法中完成的,因此返回实例的对象并不“拥有”它 - 您的数据库连接类。至此,按照惯例,您需要对实例进行内存管理:
如果您使用名称以“alloc”或“new”开头或包含“copy”(例如,alloc、newObject 或 mutableCopy)的方法创建对象,或者向其发送保留消息,则您将获得对象的所有权。您有责任放弃使用 release 或 autorelease 拥有的对象的所有权。任何其他时间您收到一个对象,您都不能释放它。
如果发送该GetEntityID
方法的对象想要保留该对象,例如,如果要将其用作实例变量,则可以保留返回的对象,防止它在当前事件结束时被释放。如果它只是在本地使用,并且不需要在当前事件之后保留,那么该类不需要做任何事情;它将在当前事件结束时由自动释放池释放。
本文解释了有关自动释放池的更多信息。
要自动释放返回的对象,GetEntityID
请执行以下操作GetEntityID
:
... // cool stuff in GetEntityID
return [[entity_id retain] autorelease];
}
看看这篇非常好的文章,更详细地解释了 Objective-C 内存管理。