2011-06-06 86 views
2

我正在使用第三方Objective-C库在后台线程中发出Web请求,然后使用[self performSelectorOnMainThread:...]返回结果,然后调用委托方法。我知道我需要在发布委托前委托引用nil,但我想知道如果在后台线程运行时请求对象本身被取消分配会发生什么。此内部self参考值是否设置为nil,以便-performSelectorOnMainThread:调用是无害的,还是有可能导致崩溃?自我释放

回答

2

据我了解你的情况(但可能你应该包括一些代码),声明:

[self performSelectorOnMainThread:...] 

应该在你的线程中执行的最后一个(因为它是返回的路上你的线程的结果,它仍然是传递给NSThread的线程选择器的一部分)。

如果是合理的话,那么考虑当你第一次分离的NSThread,你传递一个target对象(您self),并只要通过selector尚未完成NSThreadretain它。这将包括你的[self performSelectorOnMainThread:...],所以,除非有人用releases大量混乱,否则self[self performSelectorOnMainThread:...]执行之前不应该被释放。

如果您的问题确实如果有人与releases混淆会发生什么,我会再次考虑这一点。

+0

这就是我缺少的部分(即新线程将保留'self')。谢谢! – jrdioko 2011-06-06 18:30:41

2

如果在主线程上的方法完成之前解除分配了对象,则会出现内存管理问题。 performSelectorOnMainThread:…方法家族使得接收者在完成其工作之前一直保留下来,所以解除分配的唯一方式是如果你过度释放对象。