2010-06-28 81 views
4

我正在开发iPad应用程序。它使用NSOperation在后台下载一些东西,由NSOperationQueue处理。我发现,除非向NSOperation添加保留,否则在执行操作的操作后,我会发生崩溃。 NSOperationQueue的addOperation表示它保留NSOperation,而NSOperation本身保留目标对象。因此,我不理解为什么需要额外的保留。NSOperation需要额外保留

这不会阻碍我的进步,除非我试图实现取消异步操作并在其位置创建新模式的模式。我目前还无法在iPhone OS 4.0上开发它(它提供了waitUntilFinished),所以我需要另一种方法来知道释放我的额外保留是安全的(或者找到一种方法来避免额外保留)。

有什么建议吗?

+0

这听起来像是搞砸了。你能发布你的代码吗? – 2010-06-28 18:33:19

+0

该代码可能有点太复杂,无法发布。然而,这个模式正如问题所述。 i: NSOperation * op = [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(someSelector :) object:client] autorelease]; [myOpQueue addOperation:op]; 如果我不在op上额外保留,我在someSelector运行后遇到崩溃。自我是一个存在的单身人士,而客户应该由op保留。 – Shaheen 2010-06-28 18:42:23

回答

1

你如何执行'在后台下载东西'任务?如果你正在使用一个回调你的NSOperation对象的异步方法,那可能是你的问题。我的猜测是,在你的NSOperation的主要方法中,你正在使用异步方法开始下载,并且该方法稍后应该回调到你的NSOperation。问题是,一旦你的主要方法返回,NSOperation被认为已经完成,所以当你的异步下载尝试回调你的NSOperation时,它会失败,因为NSOperation已经完成并且被释放。即使在NSOperationQueue完成之后,您的额外保留通过保持NSOperation来解决此问题。你必须通过在NSOperation中使用同步下载方法来解决这个问题。

如果您已经在您的NSOperation中使用同步下载方法,那么我不确定您的问题可能是什么。

0

在框架内使用队列和异步请求ASIHTTPRequest - http://allseeing-i.com/ASIHTTPRequest/ - 帮助我解决了许多使用NSOperationQueues和许多异步下载的问题。

我认为如果问题解决了,解决得好,不要再试着解决!