HTMLパーサからロードされた階層的なHTMLデータを表示するNSOutlineTableViewがあります(各HTMLタグは属性を持つオブジェクトであり、その子の配列です)。何らかの理由で、このコードがすべてのオブジェクトを実行した後にクラッシュします。それは私がHTML内のすべてのオブジェクトののNSLog()の結果を参照してください、と言うことですが、その後のコードがクラッシュ:ここNSOutlineTableView最後の要素の後にクラッシュする
- (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秒ごとに画面に表示され、3つの要素がそれぞれの行に表示されます。
[items children]は常にNULLではなく、アイテムに子がない場合、配列は単に空です。いずれにせよ、[item children]の呼び出しではなく、最後の要素が表示された後のアイテムへの参照(この場合、[item isKindOfClass:])が発生しています。 objc_msgSend_vtable4、それが誰にでも何かを意味する場合... – Chris
itty bitty backtraceを追加してくれてありがとうございます。アイテムが有効かどうか、またはクラッシュする前に行内に "nil'ですか?また、ARCを使用していますか?あなたのコードで参照されている(つまり、データが古くなったり、クラッシュする直前に解放されたりする) –
ARCがオフです。 xCodeは、私が悪意のあるオブジェクトを解析する前に見たことがないことを私に教えてくれます。オブジェクトはすべて、インターネットから降りたHTMLパーサーで作成されます。これはlibxml/HTMLparserを扱うCocoaラッパーです。パーサーにバグがある可能性はありますか? – Chris