NSOutlineView子类崩溃 - NSRangeException

时间:2015-04-10 23:25:51

标签: cocoa core-data nstableview nsoutlineview nsindexset

我有一个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。

1 个答案:

答案 0 :(得分:2)

如果项目不在大纲中,

-[NSOutlineView rowForItem:]将返回-1(不是NSNotFound)。因此,scrollPosition为-1,scrollPosition - 1为-2。 +[NSIndexSet indexSetWithIndex:]NSUInteger(当然)无符号,因此-2变为18446744073709551614。