2013-06-19 77 views
3

當我的NSOutlineView項目展開時,我遇到訪問錯誤錯誤。當NSStrings分配stringWithFormat:時,擴展大綱時出現EXC_BAD_ACCESS錯誤。當它們以@「string」的形式替換爲字符串時,沒有錯誤。使用NSOutlineView和stringWithFormat的EXC_BAD_ACCESS

我認爲用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; 

} 

基本上,這樣做正是我所期待的單元代碼做的,但它似乎要在保留的東西。來自羣衆的任何見解?

編輯:這是交易。 NSOutlineView的dataSource委託方法對於所有權有點特別。這不是你必須通常用一個香草NSTableView來處理,因爲沒有多層次的物品。基本上,你需要創建所有的對象在其他地方顯示,並確保它們在別處的內存中進行管理,因爲NSOutlineViewDataSource不會爲你做任何事情。