【问题标题】:NSOperation Causing Crash when Passed to DelegateNSOperation 在传递给委托时导致崩溃
【发布时间】:2010-06-01 13:56:42
【问题描述】:

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

- (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(在每个代理打开多个请求的情况下)和查询结果。

@987654321@ 的文档中,明确指出:

"该方法保留receiver和arg参数,直到选择器执行完毕。"

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

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

【问题讨论】:

  • 我想出了一个临时(可能是永久)解决方案,它保留了我添加到队列中的本地操作字典。然后,委托方法返回操作的 ID(而不是引用),然后使用 ID 从本地字典中检索对对象的引用。但是,我仍然不明白为什么上面的代码不起作用。 NSOperationQueue 在完成执行后是否会以某种方式从 NSOperation 中删除所有保留计数?
  • 也许也可以从代表那里发布代码?可能是您访问它的方式导致了问题。
  • 更新帖子以包含委托代码;这很简单。我已经转移到另一个模型,该模型存储对主线程上的操作的引用。到目前为止工作得很好,但我仍然想知道为什么上述方法不起作用。

标签: cocoa cocoa-touch multithreading nsoperation


【解决方案1】:

尝试将 waitUntilDone: 参数设置为 YES。可能存在允许 NSOperation 自行释放的竞争条件。

【讨论】:

  • 在这种情况下,我认为您需要设置 NSZombieEnabled 运行。看起来你在某个地方发布了一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多