gpt4 book ai didi

ios - NSMutableIndexSet 添加索引 : Method Throws Error

转载 作者:行者123 更新时间:2023-11-29 03:19:34 25 4
gpt4 key购买 nike

在尝试从核心数据中删除一些对象时,我在使用 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);
}

任何人都可以告诉我我做错了什么以及如何解决吗?谢谢

最佳答案

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

关于ios - NSMutableIndexSet 添加索引 : Method Throws Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21270034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com