NSMutableIndexSet addIndex:方法引发错误

时间:2014-01-21 22:05:21

标签: ios objective-c uint64 nsuinteger nsindexset

在尝试从Core Data中删除某些对象时,我使用NSMutableIndexSet类和它的方法'addIndex:'遇到了一些困难。

在核心数据中,我有文件夹对象,它包含一组线程对象。每个线程都有一个threadId属性,它是一个uint64_t。我正在尝试创建这些线程ID的可变索引集,以便我可以通过它们枚举来删除它们的关联线程。

当我开始尝试将我的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 个答案:

答案 0 :(得分: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]]; 
}];