我有以下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错误,我根本无法找到它的底部。
有人有任何建议吗?
非常感谢,
答案 0 :(得分:3)
当完成block
运行时self
可能无效。在这种情况下,您需要将block
复制到heap
。
你可以包裹你的块:
[ <your block> copy];
然后是释放块的问题,很多时候自动释放效果很好:
[[ <your block> copy] autorelease];
其他时候您可能需要明确释放它。
您可能希望typedef
您的区块更清晰。
答案 1 :(得分:1)
你得到BAD_ACCESS,因为mapView或者注释已经被破坏但是你有一个指向那些实例的指针。我想你不保留mapView。您可以turning on the NSZombies和enabling stop on exception检查这类错误。
或者将此代码放在发生错误的代码行之前:
NSLog(@"mapView-desc: %@",[self.mapView description]);
NSLog(@"annotation-desc: %@",[annotation description]);
BAD_ACCESS现在应该在这两行中的一行中发生,然后你知道你忘记保留哪个obejct;)如果一切正常,则问题出在mapView或注释中的数据中。最简单的方法是启用NSZombies
并等待控制台中的消息。