2011-06-30 115 views
1

我有一個最近彈出的奇怪錯誤。 NSOperationQueue表示它有1個對象,但是我無法訪問它內部的NSOperation對象。NSOperationQueue超出範圍例外

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

但由於某些原因,它在以下異常結束:空陣」

我理解的錯誤消息,但是我要求之前很驚訝,因爲我被檢查的隊列數量指標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]; 

} 
+0

你的意思是檢查的次數和分配變量之間存在如此高的手術完成的機會? 這種情況很奇怪,因爲op =賦值是毫無意義的,根本無法使用。 – Teddy

+0

是不是併發性很好?這就是複製操作的原因,如果你真的想用第一個操作做一些操作,像我的例子那樣複製操作,然後你可以安全地使用'op'。如果你關心它是否完成,只需調用'isFinished'方法即可。 – Joe

+0

不錯。我一直在我的代碼中使用一些蘋果示例,但似乎應該注意這個「複製」的東西。與此同時,我沒有使用op =語句解決了這個問題,因爲沒有真正的需要。再次感謝喬。 – Teddy

1

的操作可能已在這兩個電話

相關問題