0

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

4

1 に答える 1

1

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

そして、私があなたのコードで見ることができることから、あなたは常に「[item children]」がゼロではないと仮定しているように見えます。

[item children]「 」に子供がいない場合はどうなりますか?結果はNULLですか?NULLオブジェクトを呼び出す必要がありますobjectAtIndexか?count私の推測はNOです。

特定のアイテムに子がない場合は、関数ごとに適切なものを返す必要があります。

于 2012-04-20T00:00:05.657 に答える