释放对象属于另一个对象 - xcode内存管理

时间:2009-05-19 08:20:05

标签: objective-c cocoa xcode memory-management

[[MyObject itemProperty] release]可以接受吗?

目前,我让MyObject获取一些数据并将其设置为itemProperty。然后,MyObject的委托将触发并使用MyObject的itemProperty数据并将其释放。这是一种可接受的内存管理方式吗?

我从各种书中都被告知你应该只发布你声明的对象。 任何提示或替代方式?

3 个答案:

答案 0 :(得分:2)

我建议不要采用你所描述的方法......你在SO上询问问题的直觉是正确的,因为这可能会导致麻烦。

对象负责管理自己的内部状态,并且委托以这种方式干扰内部状态是非常不寻常的。清理内存的常规做法是必须在MyObject方法中释放dealloc内存:

- (void)dealloc {
    [item release];
    [super dealloc];
}

事实上,如果您正在实施dealloc,您应该整理MyObject,让代理人在itemProperty向对象发送一条发布消息将意味着{{1}对象被释放两次,这将使itemProperty的保留计数处于意外状态,并可能导致它提前解除分配。如果您更改了应用程序以便其他对象可能正在使用itemProperty,则会在调用委托后发现它已被神秘地释放。

另一方面,如果您没有在itemProperty中整理内存,则会遇到依赖于调用委托以确保正确管理内存的情况。你真的可以保证在你的应用程序的某个时刻总是会调用委托方法吗?没有失败?即使存在可能导致应用程序出现异常执行流程的异常或其他错误情况,

即使你可以保证这一点,随着app逻辑的改变,这可能不再是这种情况,你会忘记委托正在进行内存管理,导致泄漏或段错误。当然,维护代码的其他可可开发人员不会考虑查看代理进行内存管理,并且可能很难调试出现的问题。

在这种情况下,让委托只使用dealloc而不保留,释放或自动释放它(当然,除非委托需要保证itemProperty仍然存在,或许,MyObject是走了)。取消分配MyObject后,将释放itemProperty数据。

答案 1 :(得分:0)

通常,只有在分配,新内容或复制内容时才会释放。由于您除了发布之外还没有提供任何其他代码,因此很难说您是否应该发布。

根据您的说法,最佳解决方案似乎是使用自动释放池。获取数据后,调用MyObject [itemProperty autorelease]。然后它将在您的代表使用它后自动释放。然而,这取决于你如何做到这一切: - )

同样,更多代码会有所帮助。

答案 2 :(得分:0)

首先,您不要声明对象。你的对象创建其他对象,拥有它们,传递它们等等。

永远不要发布您不拥有的内容。发布对象意味着“我希望不再拥有此对象”。如果你已经不拥有它,你放弃了什么?当你像这样做坏事时,期待破损。

如果您希望当前所有者停止拥有它,请告诉它。通常,这类似于[myObject setItemProperty:nil](或myObject.itemProperty = nil)。或者你可以提供一个新对象。无论哪种方式,当前所有者有责任停止拥有它。