HTMLパーサーからロードされた階層HTMLデータを表示しているNSOutlineTableViewがあります(各HTMLタグは、属性とその子の配列を持つオブジェクトです)。何らかの理由で、このコードはすべてのオブジェクトを実行した後にクラッシュします。つまり、HTML内のすべてのオブジェクトのNSLog()の結果が表示されますが、その後、コードがクラッシュします。
- (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が画面に一瞬表示され、3つの要素すべてがそれぞれの行に表示されます。