2014-01-21 55 views
0

在試圖從核心數據刪除一些對象時,我遇到了一些困難,使用NSMutableIndexSet類和它的方法'addIndex:'。NSMutableIndexSet addIndex:方法拋出錯誤

在覈心數據中,我有文件夾對象,其中包含一組線程對象。每個線程都有一個uint64_t的threadId屬性。我試圖創建這些線程標識符的可變索引集,以便我可以通過它們枚舉來刪除它們的關聯線程。

當我開始嘗試我的threadId的添加到我的可變索引集,我出現以下錯誤崩潰:

[NSMutableIndexSet addIndexesInRange:]: Range {3982867280, 1} exceeds maximum index value of NSNotFound - 1' 

這是沒有意義的,因爲我不是調用方法「addIndexesInRange: '如錯誤所示。

另外,'addIndex:'需要一個NSUInteger參數,但是從我讀的內容來看,這應該與uint64_t互換。

下面是代碼:

- (void)removeAllThreadsForFolder:(Folder *)folder 
{ 
     NSError *error; 
     NSArray *threads = [self fetchThreadsForFolder:folder error:&error]; 

     NSMutableIndexSet *threadIds = [NSMutableIndexSet new]; 

     for (Thread *thread in threads) { 
      uint64_t threadId = thread.threadId; //the threadId does exist 
      [threadIds addIndex:threadId]; //CRASH HERE!!!!!!!!!!!!!!!!! 
     } 

     [threadIds enumerateIndexesUsingBlock:^(NSUInteger threadId, BOOL *stop) { 
      [self removeThreadForFolder:folder threadId:threadId]; 
     }]; 

     [self saveContext:&error]; 
     NSLog(@"folder now has %i threads", folder.threads.count); 
} 

誰能告訴我我在做什麼錯誤,也許如何解決?謝謝

回答

1

NSMutableIndexSet addIndex:方法需要一種NSUInteger這是一個unsigned long

構建32位應用程序時,這是一個32位值。當您構建64位時,它是一個64位值。

您的threadId是一個64位值。除非您正在構建64位iOS應用程序,否則可能有很多可能的線程ID值太大而不適合32位NSUInteger值,因此會出現錯誤。

爲什麼使用索引集來保存一組線程ID?爲什麼不使用NSMutableSetNSMutableArray

然後,你可以這樣做:

NSMutableSet *threadIds = [NSMutableSet set]; 
for (Thread *thread in threads) { 
    uint64_t threadId = thread.threadId; //the threadId does exist 
    [threadIds addObject:@(threadId)]; 
} 

[threadIds enumerateObjectsUsingBlock:^(NSNumber *threadId, BOOL *stop) { 
    [self removeThreadForFolder:folder threadId:[threadId unsignedLongLongValue]]; 
}]; 
+2

*注:*即使指數被表示爲'NSUInteger','NS(可變)IndexSet'只能在'範圍內舉行的索引0 .. NSIntegerMax- 1'。這從文檔(對我來說)並不明顯,但是是快速測試的結果。因此,編號3982867280不能用作索引。 - (這不會改變你的結論的正確性。) –

+0

謝謝你的解釋。 – jac300