3

当我的一个项目展开时,我遇到了错误的访问错误NSOutlineView。用NSStrings分配时stringWithFormat:EXC_BAD_ACCESS展开大纲时出错。当它们替换为@"string"形式的字符串时,没有错误。

我认为 ARC 正在发布某些内容,但我不知道如何防止它发生。这里有什么不合适的地方?

-(NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {

    if(!item)
        return [_characterList count];
    else if( [item isKindOfClass:[Character class]] )
        return 3;

    return 0;

}

-(BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {

    if( [item isKindOfClass:[Character class]] )
        return YES;

    return NO;

}

-(id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {

    if (!item)
        return (Character*)[_characterList objectAtIndex:index];
    else {

        NSLog(@"%@", item);

        Character *characterItem = (Character*)item;

        switch (index) {
            case 0:
                return [NSString stringWithFormat:@"Api key: %@", [characterItem apiKey]];
                break;
            case 1:
                return [NSString stringWithFormat:@"Access Mask: %@", [characterItem mask]];
                break;
            case 2:
                return @"Last Updated: today";
                break;
            default:
                break;
        }

    }

    return nil;

}

-(id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {

    if([item isKindOfClass:[Character class]])
        return [(Character*)item name];
    else
        return item;

    return nil;

}
4

1 回答 1

3

我想出的解决方案(但不是特别喜欢)。将 outlineView:objectValueForTableColumn:byItem: 替换为以下代码。

-(NSView*)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {

NSTableCellView *cell = [outlineView makeViewWithIdentifier:@"characterColumn" owner:self];

    if([item isKindOfClass:[Character class]]) {
        [cell.textField setStringValue:[item name]];
    } else if([item isKindOfClass:[NSString class]]) {
        [cell.textField setStringValue:item];
    }

    return cell;

}

基本上,这正是我所期望的单元代码所做的,但它似乎正确地保留了一些东西。群众有什么见解吗?

编辑:这是交易。NSOutlineView 的 dataSource 委托方法对所有权更讲究一点。这不是您通常必须使用普通 NSTableView 处理的事情,因为没有多个级别的项目。基本上,您需要创建所有对象以在其他地方显示,并确保它们在其他地方的内存中进行管理,因为 NSOutlineViewDataSource 不会为您做任何事情。

于 2013-06-19T13:40:51.403 回答