NSOperationQueue超出范围异常

时间:2011-06-30 16:27:47

标签: iphone

我最近弹出一个奇怪的错误。 NSOperationQueue说它有1个对象但是我无法访问其中的NSOperation对象。

    if ([[queue operations] count] > 0)
    op = [queue.operations objectAtIndex:0];

但由于某种原因,它最终会出现以下异常:索引0超出空数组'

的界限

我理解错误信息但是我很惊讶,因为我在询问对象本身之前检查了队列数。

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

请记住,操作可以在不同的线程上运行,通常是。 NSOperationQueue实际上有自己的方法来获取名为operationCount的计数,并提供这个警告:

  

此方法返回的值   反映了瞬时的数量   队列中的对象并更改为   操作完成。结果是,   当你使用返回时   值,实际操作次数   可能会有所不同。你应该这样做   仅将此值用于近似值   指导,不应该依赖它   对象枚举或其他精确的   计算

您遇到的可能是并发问题。要考虑的一件事是复制操作数组。

NSArray *ops = [queue.operations copy];
if ([ops count] > 0)
{
    op = [ops objectAtIndex:0];
    //You can check if it has finished using [op isFinished];
    //and do what you need to do here
}
[ops release];

<强>更新

以下是您可能经常看到这种情况的原因

//Set up and start an NSOperation
...

//Here your call to operations probably put some sort of lock
//around operations to retrieve them but your operation also
//finished and is waiting for your lock to complete to remove
//the operation. The operations call probably returns a copy.
if([[que operations] count] > 0)
{
    //Now the operation queue can access its operations and remove
    //the item with the lock released (it can actually access as early
    //as before the call and count)

    //Uh oh now there are 0 operations
    op = [queue.operations objectAtIndex:0];

}

答案 1 :(得分:1)

两次通话之间的操作可能已经完成