我有一个NSOutlineView的子类,它监听NSManagedObjectContext更改通知并相应地更新outlineView。我的某些用户正在报告(我无法自行重现),我遇到了一个奇怪的崩溃......崩溃本身就是一个直接的NSRangeException:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSIndexSet initWithIndexesInRange:]: Range {18446744073709551614, 1} exceeds maximum index value of NSNotFound - 1'
但令人困惑的部分是发生这种情况的代码:
- (void) addedObject: (CommonListData *) item toExistingSection: (CommonListData *) existingSection atIndex: (NSInteger) index {
if (index != NSNotFound) {
[self beginUpdates];
[self insertItemsAtIndexes: [NSIndexSet indexSetWithIndex: index] inParent: existingSection withAnimation:NSTableViewAnimationEffectFade | NSTableViewAnimationSlideDown];
[self endUpdates];
NSInteger scrollPosition = [self rowForItem: item];
if (scrollPosition != NSNotFound && scrollPosition !=0) {
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:scrollPosition - 1]; // crashes here
现在,如果我正在检查NSNotFound,并且为0,为什么indexSetWithIndex:(scrollPosition-1)
仍然会给出NSRangeException?
我还可以检查以确保scollPosition有效或无效?
不确定这是否相关,但只有当我的核心数据堆栈连接到iCloud并且我得到NSPersistentStoreDidImportUbiquitousContentChangesNotification时才会发生这种情况,并且我使用上下文与通知一起执行mergeChangesFromContextDidSaveNotification。
答案 0 :(得分:2)
-[NSOutlineView rowForItem:]
将返回-1(不是NSNotFound
)。因此,scrollPosition
为-1,scrollPosition - 1
为-2。 +[NSIndexSet indexSetWithIndex:]
取NSUInteger
(当然)无符号,因此-2变为18446744073709551614。