2013-06-19 2 views
3

Я столкнулся с плохой ошибкой доступа, когда элемент моего NSOutlineView расширен. Когда NSStrings выделяются stringWithFormat:, при расширении контура возникает ошибка EXC_BAD_ACCESS. Когда они заменяются строками в форме @ "string", ошибки не возникает.EXC_BAD_ACCESS с NSOutlineView и stringWithFormat

Я предполагаю, что что-то выпускается с 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; 

} 
+0

Попробуйте добавить копию как: return [[NSString stringWithFormat: ...] copy]; – stosha

+0

Нет кубиков. Это была моя первая наклонность. – promacuser

+1

Попробуйте включить зомби – stosha

ответ

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; 

} 

В принципе, это то, что я ожидаю от кода ячейки, но, похоже, он правильно сохраняет вещи. Любое понимание масс?

EDIT: Вот сделка. Методы делегирования данных dataSource от NSOutlineView немного более конкретны. Это не то, с чем вам приходится иметь дело обычно с ванильным NSTableView, так как не существует нескольких уровней элемента. В принципе, вам нужно создать все объекты для отображения в другом месте и убедиться, что они управляются в памяти в другом месте, потому что NSOutlineViewDataSource не собирается делать что-либо из этого для вас.

Смежные вопросы