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

时间:2009-10-16 06:39:05

标签: iphone objective-c

类的实例方法是否可以自行释放?

即要有一个调用方法:

[self release]

假设我的代码在调用[self release]

后不会访问self

5 个答案:

答案 0 :(得分:1)

如果你做过像

这样的事情,你应该这样做
[self retain];

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

答案 1 :(得分:1)

虽然我怀疑你发布后会立即移动内存,但请记住,[自我发布]所在的代码位于对象内部的内存块中。因此,有可能在从[self release]返回之后,最终会出现不再分配的代码,并且正在被其他进程写入。不能确定这是多么可能,但似乎有可能。

答案 2 :(得分:1)

我曾经使用过这种技术,类似的情况(来自Web委托的独立对象处理响应可能比启动请求的视图更长)。

它确实有效,但实际上做起来确实相当棘手。从那时起,我发现在NSOperationQueue中使用NSOperations是一种更加可靠且易于理解的方法,用于封装独立于请求者运行的后台操作。通常在执行操作时,会在主线程上发出通知,通知任何调用者可能仍然存在,该数据已准备好接收。

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

答案 3 :(得分:1)

  

类的实例方法是否可以自行释放?

     

即要有一个调用方法:

     

[自我释放]

     

假设我的代码在调用[self release]

后不会访问self

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

您的代码是类对象的一部分。因此,调用[自我释放]并不是一个真正的问题。当然,从封装的角度来看,如果你调用[self autorelease],你会更安全。至少那时,如果调用链中有人调用您的方法,则不会导致异常。

安德鲁

答案 4 :(得分:0)

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

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