У меня есть 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 появляется на экране в течение секунды, со всеми тремя элементами в их соответствующих строках.
[item children] всегда не является NULL, если у элемента нет детей, массив просто пуст. Во всяком случае, авария не происходит при вызове [item children], а скорее к любой ссылке на элемент после отображения последнего элемента (в этом случае [item isKindOfClass:]. Последний вызов в стеке objc_msgSend_vtable4, если это что-то значит кому-либо ... – Chris
спасибо за добавление биттированной обратной линии. Является ли элемент действительным или это «' nil' »в строке перед сбоем? Также вы используете ARC и как данные элемента (например, любая вероятность того, что данные будут устаревать или будут выпущены прямо перед сбоем) –
Нет проблем. Посмотрим .. ARC выключен. Элемент не оценивает значение nil или NULL, однако адрес, который xCode дает мне плохой объект, который никогда не видел раньше при разборе. Все объекты созданы в парсере HTML, который я получил из Интернета, который представляет собой оболочку Cocoa вокруг libxml/HTMLparser, поэтому я не коснулся управления памятью там Есть ли вероятность, что это просто ошибка в парсере? – Chris