NSOperation传递给委托时导致崩溃

时间:2010-06-01 13:56:43

标签: cocoa cocoa-touch multithreading nsoperation

对于iPhone应用程序,我使用NSOperationQueue将SQLite数据库的访问限制为一次一个查询。我创建了NSOperation的子类,在main函数中我有以下内容:

- (void)main
{    
    // ... other code here ...

    if( [_delegate respondsToSelector:@selector(queryCompleted:)] )
    {
        [_delegate performSelectorOnMainThread:@selector(queryCompleted:) 
                                    withObject:self
                                 waitUntilDone:NO];
    }
}

代表方:

- (void)queryCompleted:(QueryOperation*)aQueryOperation
{
     // Breakpoint here allows me to explore and see the members of aQueryOperation

     id results = [aQueryOperation resultSet]; // Crashes here

     // ... more code here ...
}

我传递self的原因是允许委托访问查询操作的ID(在每个代理打开多个请求的情况下)和查询结果。

performSelectorOnMainThread:withObject:waitUntilDone:的文档中,它明确指出:

  

“此方法保留接收器和arg参数,直到执行选择器之后。”

但是,当委托方法尝试访问参数时,会抛出“EXC_BAD_ACCESS”异常。有什么想法吗?

奇怪的是,如果我在对NSOperation对象的崩溃引用之前设置了一个断点,那么调试器允许我查看对象实例和所有参数的值。

1 个答案:

答案 0 :(得分:0)

尝试将waitUntilDone:参数设置为YES。可能存在一种竞争条件,即允许NSOperation解除分配。