在对象类的方法中释放对象是否可以接受

问题描述:

类的实例方法是否可以自行释放?在对象类的方法中释放对象是否可以接受

即有一个调用的方法:

[self release] 

假设我的代码不会调用后访问自[自发布]

+1

请进一步描述你为什么要这样做。 – nall 2009-10-16 06:41:23

+1

借调。你想在这里完成什么? – 2009-10-16 17:08:05

+0

我发现基本上是相同的问题:http://*.com/questions/1385433/is-calling-self-release-allowed-to-control-object-lifetime 我的情况是类似的,存在的对象,进行网络调用,写入sqlite,并控制自己的生命周期。例如,它从NSUrlConnection接收回调,它写入sqlite,并完成。 我想回调可能是应用程序委托,它处理发布,但我喜欢封装逻辑作为此对象的一部分的想法。 我喜欢使用autorelease而不是release的建议之一。 – Alan 2009-10-16 18:00:54

一个类的实例方法释放它自己是可以接受的吗?

即有一个调用的方法:

[自发布]

假设我的代码不会调用后访问自[自发布]

首先,我想要有一个非常好的理由来释放自己。我唯一一次完成它是在一个单身人士,我转储释放iPhone上的大块内存。这是一件罕见的事情。

您的代码是类对象的一部分。因此,调用[自我释放]并不是一个真正的问题。当然,如果你打电话给[self autorelease],从封装的角度来看,你更安全。至少在那时,如果呼叫链上的某个人调用了你的方法,你不会引发异常。

Andrew

,如果你做的东西你只能这样做像

[self retain]; 

但目前尚不清楚为什么你会那样做。 Cocoa Memory Management Documentation可能有帮助

虽然我怀疑在你释放之后,内存会移动很多,请记住你的[self release]所在的代码驻留在你的对象内部的一个内存块中。因此,从[自释放]返回后,您可能会得到不再分配的代码,并且正在被其他进程写入。不能肯定地说有可能,但看起来可能。

我以前曾经使用过这种技术,对于类似的情况(来自web委托的独立对象处理响应,可能会超出启动请求的视图)。

它确实有效,但实际上确实很棘手。从那以后,我发现在NSOperationQueue中使用NSOperations是一种更加坚实和易于理解的方法来封装独立于请求者运行的后台操作。通常当一个操作完成时,通知会在主线程上发出,通知任何呼叫者可能仍在周围的数据已准备好提取。

加上简单的远程请求,您可以在操作中使用更简单的同步URL调用,因为它们在单独的线程中运行,并且不会在数据传入时阻塞主线程(例如,从URL中获取小图像时很方便) 。

+0

感谢您的回复。实际上,我首先在线程中使用同步Web请求将其写为线程。 我想摆脱线程的复杂性,并开始考虑使用这种新方法。 – Alan 2009-10-16 21:00:51

你可以做到。有用。这是有点危险的,尤其是因为优化编译器可以按照您不想要的方式重新排列代码。

有点安全的是调用[self autorelease],它会在不久的将来释放当前对象(下一次通过runloop)而不是立即释放。