Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSMutableIndexSet addIndex:方法引发错误_Ios_Objective C_Uint64_Nsuinteger_Nsindexset - Fatal编程技术网

Ios NSMutableIndexSet addIndex:方法引发错误

Ios NSMutableIndexSet addIndex:方法引发错误,ios,objective-c,uint64,nsuinteger,nsindexset,Ios,Objective C,Uint64,Nsuinteger,Nsindexset,在尝试从核心数据中删除一些对象时,我在使用NSMutableIndexSet类及其方法“addIndex:”时遇到了一些困难 在核心数据中,我有文件夹对象,其中包含一组线程对象。每个线程都有一个threadId属性,该属性是uint64\t。我正在尝试创建这些线程ID的可变索引集,以便可以枚举它们来删除它们关联的线程 当我开始尝试将我的threadId添加到可变索引集中时,出现以下错误导致崩溃: [NSMutableIndexSet addIndexesInRange:]: Range {398

在尝试从核心数据中删除一些对象时,我在使用NSMutableIndexSet类及其方法“addIndex:”时遇到了一些困难

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

当我开始尝试将我的threadId添加到可变索引集中时,出现以下错误导致崩溃:

[NSMutableIndexSet addIndexesInRange:]: Range {3982867280, 1} exceeds maximum index value of NSNotFound - 1'
这没有意义,因为我没有像错误所暗示的那样调用方法'AddIndexInsRange'

另外,'addIndex:'接受一个整数参数,但从我的阅读来看,这应该可以与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);
}

有谁能告诉我我做错了什么,或者如何修复?谢谢

NSMutableIndexSet addIndex:
方法需要一种类型的
NSUInteger
,它是一种
无符号长型

构建32位应用程序时,这是一个32位值。构建64位时,它是一个64位值

您的
threadId
是一个64位的值。除非您正在构建64位iOS应用程序,否则许多可能的线程id值可能太大,无法容纳32位
NSUInteger
值,因此会出现错误

为什么要使用索引集来保存一组线程ID?为什么不使用
NSMutableSet
NSMutableArray

然后你可以做:

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]]; 
}];

备注:即使索引表示为
NSUInteger
NS(可变)索引集
也只能保存范围
0.内的索引。。NSIntegerMax-1
。这在文档中(对我来说)并不明显,而是快速测试的结果。因此,数字3982867280不能用作索引。-(这不会改变你结论的正确性。)谢谢你的解释。