2014-01-13 2 views
1

Это в основном «мир привет» NSOutlineView с источником данных. Все, что я делаю, это перетащить NSOutlineView в окно MainMenu.xib, подключить его к розетке, а затем попытаться установить его источник данных для простой реализации. Когда я запускаю его, я получаю Thread 1: EXC_BAD_ACCESS, но трассировка стека в отладчике помогает мне.Почему EXC_BAD_ACCESS в этом простом источнике данных NSOutlineView?

(lldb) bt 
* thread #1: tid = 0x158e35, 0x00007fff8948d097 libobjc.A.dylib`objc_msgSend + 23, queue = 'com.apple.main-thread, stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT) 
frame #0: 0x00007fff8948d097 libobjc.A.dylib`objc_msgSend + 23 
frame #1: 0x00007fff8839e590 AppKit`loadItemEntryLazyInfoIfNecessary + 120 
frame #2: 0x00007fff883d3e5f AppKit`-[NSOutlineView _rowEntryForRow:requiredRowEntryLoadMask:] + 77 
frame #3: 0x00007fff883d37d1 AppKit`-[NSOutlineView frameOfCellAtColumn:row:] + 323 
frame #4: 0x00007fff885d5548 AppKit`-[NSTableView drawRow:clipRect:] + 1154 
frame #5: 0x00007fff885d4f7d AppKit`-[NSTableView drawRowIndexes:clipRect:] + 776 
... 

Когда я установил точки останова, я вижу только один из моих методов, вызываемых. (outlineView:numberOfChildrenOfItem:) Вот мой код. Есть идеи?

Он создает три простых элемента «root» и возвращает строку для значений. В любом случае это никогда не получится, согласно точкам останова.

В приложение делегата:

@implementation TmTrkAppDelegate 

- (void)applicationDidFinishLaunching:(NSNotification *)notification 
{ 
    _outlineView.dataSource = [[TmTrkOutlineViewDataSource alloc] init]; 
} 

@end 

Источник данных:

@interface TmTrkOutlineViewDataSource : NSObject <NSOutlineViewDataSource> 

@end 
... 

@interface TmTrkTagItem : NSObject { 

} 

@end 

@implementation TmTrkTagItem { 

} 

@end 

@implementation TmTrkOutlineViewDataSource { 
    NSMutableArray *_roots; 
} 

- (id)init { 
    printf("init\n"); 
    self = [super init]; 
    if (self) { 
     _roots = [[NSMutableArray alloc] init]; 
     for (int i=0; i<3; i++) { 
      id item = [TmTrkTagItem new]; 
      [_roots addObject:item]; 
     } 
     printf("Created _roots %d.\n", (int)_roots.count); 
    } 
    return self; 
} 

- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item { 
    if (!item) { 
     printf("child: %d ofItem: %s\n", (int)index, [item description].UTF8String); 
     return _roots[index]; 
    } 
    return nil; 
} 

- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { 
    if (!item) return YES; 
    else return NO; 
} 

- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { 
    if (!item) return _roots.count; 
    else return 0; 
} 

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { 
    NSString *val = @"Test Value"; 
    return val; 
} 

@end 

Это новый проект, в Xcode 5.0.2 с поддержкой ARC.

+2

Ваш источник данных может быть выпущен сразу после его создания, поскольку ваш делегат приложения не поддерживает сильную ссылку на него, а источник данных NSOutlineView также является слабой ссылкой. – NSAdam

+0

Ugg. Да, это все. Благодарю. Я слишком долго жил в мире Java. –

+0

@NSAdam Пожалуйста, отправьте свой комментарий в ответ, чтобы мы могли закрыть этот вопрос, и вы можете получить кредит! –

ответ

1

Ваш источник данных может быть выпущен сразу после его создания, поскольку ваш делегат приложения не поддерживает сильную ссылку на него, а источник данных NSOutlineView также является слабой ссылкой.

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

  • Нет связанных вопросов^_^