2012-04-19 4 views
0

У меня есть NSOutlineTableView, который отображает иерархические данные HTML, загруженные из анализатора HTML (каждый тег HTML является объектом с атрибутами и массивом его дочерних элементов). По какой-то причине этот код выходит из строя после того, как он прошел через все объекты. То есть, я вижу результаты NSLog() для всех объектов в HTML, но после того, что код аварии:NSOutlineTableView Crash после последнего элемента

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

    if (item==nil) { 
     item=rootNode; 
    } 
    NSLog(@"looking for child %d of element %@",index, item); 
    return [[item children] objectAtIndex:index]; 

} 


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

    if (item==nil) { 
     item=rootNode; 
    } 
    NSLog(@"Element %@ has %i children", item, [[item children] count]); 
    return [[item children ]count]; 

} 


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

    NSLog(@"is item %@ with %@ children expandable?",item,[item children]); 
    return [[item children] count]>0; 

} 


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

    if (![item isKindOfClass:[HTMLNode class]]) { //////CRASH ON THIS LINE (or at least in this function) 
     return @""; 
    } 

    NSLog(@"Object value for: %@",item); 

    return [NSString stringWithFormat:@"%@",[item description]]; 

} 

Вот пример запуска: HTML содержание: @"<ul></ul><span class='spantext1'></span><span class='spantext2'></span>";

Выход:

Element <HTMLNode: 0x7fb9234462a0> body has 3 children 

looking for child 0 of element <HTMLNode: 0x7fb9234462a0> body 

is item <HTMLNode: 0x7fb923437d40> ul with (
) children expandable? 

Object value for: <HTMLNode: 0x7fb923437d40> ul 

looking for child 1 of element <HTMLNode: 0x7fb9234462a0> body 

is item <HTMLNode: 0x7fb9249255c0> span with (
) children expandable? 

Object value for: <HTMLNode: 0x7fb9249255c0> span 

looking for child 2 of element <HTMLNode: 0x7fb9234462a0> body 

is item <HTMLNode: 0x7fb92491e1d0> span with (
) children expandable? 

Object value for: <HTMLNode: 0x7fb92491e1d0> span 
(lldb) (crash with EXC_BAD_ACCESS) 

Вот вершина стека вызовов:

objc_msgSend() selector name: isKindOfClass: 
objc[23702]: garbage collection is OFF 

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 
0 libobjc.A.dylib     0x00007fff846e7110 objc_msgSend_vtable4 + 16 
1 com.303DesignLabs.SiteStats  0x0000000109dd44fd -[HTMLTreeOutlineController outlineView:objectValueForTableColumn:byItem:] + 189 (HTMLTreeOutlineController.m:51) 

Похоже, что он пытается запустить objectValueForTableColumn еще раз, после того, как все данные были выполнены. Как я уже сказал, авария происходит после того, как вся иерархия объектов была запущена (как видно из вывода терминала). Во всяком случае, перед сбоем tableView появляется на экране в течение секунды, со всеми тремя элементами в их соответствующих строках.

ответ

1

«EXC_BAD_ACCESS» обычно означает, что вы пытаетесь получить доступ к объекту nil или указателю.

И из того, что я вижу в вашем коде, похоже, что вы всегда считаете, что «[item children]» не ноль.

Что произойдет, если «[item children]» не имеет детей? это результат NULL? Должны ли вы звонить objectAtIndex или count на объект NULL? Я думаю, что НЕТ.

Вы должны, вероятно, вернуть что-то разумное для каждой функции, если для данного предмета нет детей.

+0

[item children] всегда не является NULL, если у элемента нет детей, массив просто пуст. Во всяком случае, авария не происходит при вызове [item children], а скорее к любой ссылке на элемент после отображения последнего элемента (в этом случае [item isKindOfClass:]. Последний вызов в стеке objc_msgSend_vtable4, если это что-то значит кому-либо ... – Chris

+0

спасибо за добавление биттированной обратной линии. Является ли элемент действительным или это «' nil' »в строке перед сбоем? Также вы используете ARC и как данные элемента (например, любая вероятность того, что данные будут устаревать или будут выпущены прямо перед сбоем) –

+0

Нет проблем. Посмотрим .. ARC выключен. Элемент не оценивает значение nil или NULL, однако адрес, который xCode дает мне плохой объект, который никогда не видел раньше при разборе. Все объекты созданы в парсере HTML, который я получил из Интернета, который представляет собой оболочку Cocoa вокруг libxml/HTMLparser, поэтому я не коснулся управления памятью там Есть ли вероятность, что это просто ошибка в парсере? – Chris

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