【问题标题】:How do I handle memory management in this situation?在这种情况下如何处理内存管理?
【发布时间】:2009-06-20 18:59:46
【问题描述】:

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

这很好用,但是调用 GetEntityByID 的人必须记住释放它。由于 GetEntityByID 不是“init”方法,这似乎不对。在这种情况下如何最好地处理内存管理?

【问题讨论】:

  • 好问题,下面的答案很棒。只是一个样式说明:方法名称通常以小写字母开头,因此 getEntityByID: 会更好。无论您如何命名,它都可以工作,但编码约定可以帮助使代码更易于维护。 :-)

标签: objective-c memory-management autorelease


【解决方案1】:

您可以在类的 GetEntityID 方法中调用 autorelease 以自动释放实例(如果没有以其他方式保留)。

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

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

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

This article 解释了有关自动释放池的更多信息。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我看不出有任何保留保留的理由,但自动释放是正确的答案。
    • 是的,retain] autorelease] 没有帮助。当您希望在不久的将来释放原始值并且希望在自动释放池刷新之前保持变量的值处于活动状态时,使用一对保留和自动释放。
    • 我只是为了安全起见,因为我不知道对方法中的返回值做了什么。
    猜你喜欢
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多