xmlParser中的exc_bad_access(code = 2,address = 0x20)

时间:2012-08-17 10:37:22

标签: iphone objective-c ios

我在我的应用程序中使用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];
}

我正在使用自动引用计数。那么我的代码有什么问题?

1 个答案:

答案 0 :(得分:0)

我假设getTheServerStatus是在一个不是主线程的线程上调用的。然而,你在主线程上进行解析。是否有可能第二个线程破坏解析器?

编辑:代码已更改

所以你应该做的不是在getTheServerStatus:中阻止,而是将你的问题分成两部分。首先是你想要获得状态 - 所以你将派遣一个区块为你做这项工作。在这种情况下,你可以抛出一个微调器,或者只是禁用你的一些UI。这当然是一个设计决定。当后台线程查找状态完成后,它会在主线程上通过结果向您发送消息,然后您可以执行任何您想要的操作。我只是posted对类似问题的答案,该问题包含更多代码,您可能会觉得有用。

{ // 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 .....
}