【问题标题】:NSMutableIndexSet addIndex: Method Throws ErrorNSMutableIndexSet addIndex:方法抛出错误
【发布时间】:2014-01-21 22:05:20
【问题描述】:

在尝试从 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);
}

谁能告诉我我做错了什么以及如何解决?谢谢

【问题讨论】:

    标签: ios objective-c uint64 nsuinteger nsindexset


    【解决方案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]]; 
    }];
    

    【讨论】:

    • 备注:即使索引表示为NSUIntegerNS(Mutable)IndexSet也只能保存0 .. NSIntegerMax-1范围内的索引。这在文档中并不明显(对我来说),而是快速测试的结果。因此数字 3982867280 不能用作索引。 - (这不会改变你结论的正确性。)
    • 感谢您的解释。
    猜你喜欢
    • 2015-03-08
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多