2012-04-19 9 views
0

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つの要素がそれぞれの行に表示されます。

答えて

1

"EXC_BAD_ACCESS"は、通常、オブジェクトまたはポインタにアクセスしようとしていることを意味します。

あなたのコードで見ることができますが、あなたは常に "[item children]"がnilではないと思われるようです。

"[item children]"に子がない場合はどうなりますか?結果はNULLですか?ヌルオブジェクトでobjectAtIndexまたはcountと呼ぶべきですか?私の推測はNOです。

任意のアイテムに子がない場合は、おそらく関数ごとに分かりやすいものを返す必要があります。

+0

[items children]は常にNULLではなく、アイテムに子がない場合、配列は単に空です。いずれにせよ、[item children]の呼び出しではなく、最後の要素が表示された後のアイテムへの参照(この場合、[item isKindOfClass:])が発生しています。 objc_msgSend_vtable4、それが誰にでも何かを意味する場合... – Chris

+0

itty bitty backtraceを追加してくれてありがとうございます。アイテムが有効かどうか、またはクラッシュする前に行内に "nil'ですか?また、ARCを使用していますか?あなたのコードで参照されている(つまり、データが古くなったり、クラッシュする直前に解放されたりする) –

+0

ARCがオフです。 xCodeは、私が悪意のあるオブジェクトを解析する前に見たことがないことを私に教えてくれます。オブジェクトはすべて、インターネットから降りたHTMLパーサーで作成されます。これはlibxml/HTMLparserを扱うCocoaラッパーです。パーサーにバグがある可能性はありますか? – Chris