Objective-C:向地图添加注释时的EXC_BAD_ACCESS

时间:2011-09-25 15:59:18

标签: iphone objective-c

我有以下Objective-C代码:

NSString *urlStr=[[NSString alloc] initWithFormat:@"http://www.prestocab.com/driver/ajax/getFriendsOnMap.php"];
    NSURL *url=[NSURL URLWithString:urlStr];

    __block ASIFormDataRequest *request=[[ASIFormDataRequest alloc ]initWithURL:url];

    [request setDelegate:self];
    [request setPostValue:[NSString stringWithFormat:@"%f",swCoord.latitude ] forKey:@"sw_lat"];
    [request setPostValue:[NSString stringWithFormat:@"%f",swCoord.longitude ] forKey:@"sw_lng"];
    [request setPostValue:[NSString stringWithFormat:@"%f",neCoord.latitude ] forKey:@"ne_lat"];
    [request setPostValue:[NSString stringWithFormat:@"%f",neCoord.longitude ] forKey:@"ne_lng"];

    [request setCompletionBlock:^{
        NSLog(@"%@",[request responseString]);
        SBJsonParser *parser=[[SBJsonParser alloc]init];
        //NSDictionary *obj=[parser objectWithString:[request responseString] error:nil];
        NSDictionary *arr=[parser objectWithString:[request responseString] error:nil];

        MapViewAnnotation *annotation=[[MapViewAnnotation alloc]init];
        for(int i=0;i<arr.count;i++){
            NSDictionary *obj=[arr objectForKey:[NSString stringWithFormat:@"%d",i]];
            CLLocationCoordinate2D coord;
            coord.latitude=[[obj objectForKey:@"lat"] doubleValue];
            coord.longitude=[[obj objectForKey:@"lng"] doubleValue];
            [annotation initWithTitle:[obj objectForKey:@"uname"] andCoordinate:coord];

            //[self.mapView performSelectorOnMainThread:@selector(addAnnotation) withObject:annotation waitUntilDone:YES];
            [self.mapView addAnnotation:annotation];

        }
        [annotation release];
        //[self.mapView addAnnotations:annotations];
        //[annotations release];
    }];
    [request setFailedBlock:^{

    }];
    [request startAsynchronous];

正如您所看到的,我使用ASIHttpRequest从我的网站获取一些数据,解析结果并希望在MKMapView上添加注释。

麻烦的是,当我调用[self.mapView addAnnotation:...]时,我一直得到其中一个EXC_BAD_ACCESS错误,我根本无法找到它的底部。

有人有任何建议吗?

非常感谢,

2 个答案:

答案 0 :(得分:3)

当完成block运行时self可能无效。在这种情况下,您需要将block复制到heap

你可以包裹你的块:

[ <your block> copy];

然后是释放块的问题,很多时候自动释放效果很好:

[[ <your block> copy] autorelease];

其他时候您可能需要明确释放它。

您可能希望typedef您的区块更清晰。

答案 1 :(得分:1)

你得到BAD_ACCESS,因为mapView或者注释已经被破坏但是你有一个指向那些实例的指针。我想你不保留mapView。您可以turning on the NSZombiesenabling stop on exception检查这类错误。

或者将此代码放在发生错误的代码行之前:

NSLog(@"mapView-desc: %@",[self.mapView description]);
NSLog(@"annotation-desc: %@",[annotation description]);

BAD_ACCESS现在应该在这两行中的一行中发生,然后你知道你忘记保留哪个obejct;)如果一切正常,则问题出在mapView或注释中的数据中。最简单的方法是启用NSZombies并等待控制台中的消息。