現在用的是的NSMutableSet是偉大的工作,直到這個奇怪的SIGABRT錯誤彈出:NSMutableSet count = 1,但該對象爲空?
2011-07-05 17:01:00.249大媽[1497:CD57] *終止應用程序由於未捕獲異常 'NSInvalidArgumentException',原因是: ' - [__ NSCFSet的removeObject:]:嘗試刪除零'
好吧,我不能刪除零,但這裏是我的代碼:
id item = nil;
if ([theSet count] == 0) { // This equals 1 !!
item = [[[self getClass] alloc] init];
} else {
item = [[theSet anyObject] retain]; //this returns nil !!
[theSet removeObject:item]; // ERROR !!
}
用GDB控制檯,我發現theSet看起來像這樣:
(GDB)PO theSet
{(
(null)
)}
(GDB)打印(INT)[ theSet count]
$ 1 = 1
這怎麼可能?
PS:我在一個多線程的環境中運行。我不能保證在沒有被兩個線程同時訪問,但它不應該是這樣..
編輯
請,我真的想知道如何能NSSet中結束了(空),我不關心它是如何到達那裏。無論我的多線程程序有多髒,這不應該」我想,不會發生。 [和我加倍檢查,這個集合只能被後臺工作線程訪問]。
EDIT
2011-07-05 17:39:55.884應用[1608:c59f]設置計數= 2 包含:{(
< Step: 0xc43f3e0>, < Step: 0x62f1800>)}
2011-07-05 17:39:55.886 應用[1608:c59f]設置計數= 9包含:{(
> < Step: 0x62eece0>,
> < Step: 0xc490660>,
> < Step: 0xcb597d0>,
> < Step: 0x65a4f60>,
> < Step: 0xc43f4b0>,
> < Step: 0xc43f3e0>,
> < Step: 0x65c8f60>,
> < Step: 0xc499230>,
> (null))} //null appeared?!
提示!!
檢查出Step
dealloc方法(XD):
-(void)dealloc{
if (![[PoolStep sharedPool] purgeFlag]) {
[[PoolStep sharedPool] doneWithItem:self]; //put it in the object pool for reuse..
} else {
NSLog(@"=== STEP ====> [ %d ]", --_counter);
[children release];
[super dealloc];
}
}
另一個HINT !!
PoolStep是sharedPool方法中沒有@synchronize塊的單例,因爲它只被一個線程訪問。(並且需要性能)
[theSet count] returned 1 ..這就是讓我困惑的事......更不用說gdb輸出 – Mazyod