【发布时间】: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