0

アプリケーションでxmlパーサーを使用しています。アプリケーションを10〜15回実行すると、正常に動作しますが、突然、上記のコードでbad_accessが表示されます。私のxmlパーサーコードは次のとおりです。

    -(BOOL)getTheServerStatus:(NSData *)webData
{
    if (webData==NULL) 
    {
        return FALSE;
    }

    parser=[[NSXMLParser alloc]initWithData:webData];
    [parser setDelegate:self];

    [self performSelectorOnMainThread:@selector(parseData:)
                           withObject:webData
                        waitUntilDone:YES];


    if([strVal isEqualToString:@"ok"])
    {
        return TRUE;   
    }

    else 
    {
        return FALSE;

    }

}

- (void)parseData:(NSData *)webData
{
    if(webData==NULL)
    {
        NSLog(@"web data is NULL");
    }
    [parser parse];
}

自動参照カウントを使用しています。コードの問題は何ですか?

4

1 に答える 1

0

getTheServerStatusは、メインスレッドではないスレッドで呼び出されていると思います。ただし、メインスレッドで解析を行います。パーサーを壊す2番目のスレッドは可能ですか?

編集:コードが変更されました

したがって、getTheServerStatus:でブロックするのではなく、問題を2つの部分に分割する必要があります。1つ目は、ステータスを取得することです。そのため、ブロックをディスパッチして、その作業を行います。その間、スピナーをスローするか、UIの一部を無効にすることができます。もちろん、それは設計上の決定です。ステータスを探しているバックグラウンドスレッドが完了すると、結果とともにメインスレッドにメッセージが返され、必要なアクションを実行できます。私は、さらに多くのコードを含む同様の質問への回答を投稿しました。これは役立つかもしれません。

{ // ivars
    NSXMLParser *parser; // so you can send it abortParsing to cancel the background block
}

-(void)getTheServerStatus:(NSData *)webData
{
    if (webData==nil) // nil is for objects, NULL for pointers
    {
        dispatch_async(dispatch_get_main_queue(), ^{ [self parseResult:NO]; } );
    }

    parser=[[NSXMLParser alloc]initWithData:webData];
    [parser setDelegate:self];

    dispatch_async(dispatch_get_global_queue(0,0), ^
        {
            BOOL ret = [parser parse];
            parser = nil;
            if(ret == YES) {
                    ret = [strVal isEqualToString:@"ok"]; // EDIT
            }
            dispatch_async(dispatch_get_main_queue(), ^{ [self parseResult:ret]; } );
        } );
}

-(void)parserResult:(BOOL)retCode
{
    // now on main thread...
    if(retCode == YES) ....
    else .....
}
于 2012-08-17T13:19:50.447 に答える