在MKMapView上尝试多个注释时出现SIGABRT错误

时间:2011-10-08 23:19:02

标签: ios annotations mkmapview sigabrt

我一直在使用MKMapView并将Annotation Pins放在地图上。我正努力在地图中为30个不同的位置放置30个引脚,并确保在添加每个附加位置后运行iPhone SDK。然后,它无处不在,它开始崩溃并给我可怕的'SIGABRT'。 AG !!

我知道在我的语法中可能是一个轻微的错误但是因为我刚刚复制并粘贴以前有效的代码,所以我很茫然。我正在考虑使用MKCoordinateRegionMake使一切更简洁(我读到这可能是一个选项)但我已经进入了类似10个商店的东西所以它需要很多时间来切换它,我不想要如果这是一个快速修复,那就去做。

我继续取出除了一个坐标之外的所有坐标,它起作用了。然后我再添加了一个,它起作用,等等。由于某种原因,它有很多次,但有时它会锁定并崩溃。我认为只是特定的位置是一个问题,但它似乎从来没有特别是任何位置的语法问题。所以现在我对造成它的原因感到茫然。

我认为这可能是分配和释放的问题,我做得不对?我试图在代码中“释放”某些已分配的空间,但问题仍然存在。我也尝试在代码期间不释放分配空间的情况下做同样的问题。

以下是我正在使用的代码(所有代码都有效,所以我在MillersLocations文件中正确设置了标题,副标题和坐标):

MapViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    //Miller's Neighborhood Market #56
    MKCoordinateRegion store56;
    store56.center.latitude = 36.8605679;
    store56.center.longitude = -76.2866713;
    store56.span.latitudeDelta = 0.1;
    store56.span.longitudeDelta = 0.1;
    [mapView setRegion:store56 animated:YES];

    MillersLocations *ann56 = [[MillersLocations alloc]init];
    ann56.title = @"Store #56";
    ann56.subtitle = @"Come check us out!";
    ann56.coordinate = store56.center;
    [mapView addAnnotation:ann56];
    [MillersLocations release];
    //Not sure if release should be on this syntax


    //Miller's Neighborhood Market #66
    MKCoordinateRegion store66;
    store66.center.latitude = 37.0942970;
    store66.center.longitude = -76.4584890;
    store66.span.latitudeDelta = 0.1;
    store66.span.longitudeDelta = 0.1;
    [mapView setRegion:store66 animated:YES]; 

    MillersLocations *ann66 = [[MillersLocations alloc]init];
    ann66.title = @"Store #66";
    ann66.subtitle = @"Come check us out!";
    ann66.coordinate = store66.center;
    [mapView addAnnotation:ann66];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #21
    MKCoordinateRegion store21;
    store21.center.latitude = 37.0385289;
    store21.center.longitude = -76.4004810;
    store21.span.latitudeDelta = 0.1;
    store21.span.longitudeDelta = 0.1;
    [mapView setRegion:store21 animated:YES];    

    MillersLocations *ann21 = [[MillersLocations alloc]init];
    ann21.title = @"Store #21";
    ann21.subtitle = @"Come check us out!";
    ann21.coordinate = store21.center;
    [mapView addAnnotation:ann21];
    [MillersLocations release];
    //Not sure if release should be on this syntax


    //Miller's Neighborhood Market #67
    MKCoordinateRegion store67;
    store67.center.latitude = 37.6823690;
    store67.center.longitude = -77.5898330;
    store67.span.latitudeDelta = 0.1;
    store67.span.longitudeDelta = 0.1;
    [mapView setRegion:store67 animated:YES];

    MillersLocations *ann67 = [[MillersLocations alloc]init];
    ann67.title = @"Store 67";
    ann67.subtitle = @"Come check us out";
    ann67.coordinate = store67.center;
    [mapView addAnnotation:ann67];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #49
    MKCoordinateRegion store49;
    store49.center.latitude = 36.8550990;
    store49.center.longitude = -76.1355950;
    store49.span.latitudeDelta = 0.1;
    store49.span.latitudeDelta = 0.1;
    [mapView setRegion:store49 animated:YES];

    MillersLocations *ann49 = [[MillersLocations alloc]init];
    ann49.title = @"Store 49";
    ann49.subtitle = @"Come check us out";
    ann49.coordinate = store49.center;
    [mapView addAnnotation:ann49];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #82
    MKCoordinateRegion store82;
    store82.center.latitude = 36.7848840;
    store82.center.longitude = -76.1587459;
    store82.span.latitudeDelta = 0.1;
    store82.span.latitudeDelta = 0.1;
    [mapView setRegion:store82 animated:YES];

    MillersLocations *ann82 = [[MillersLocations alloc]init];
    ann82.title = @"Store 82";
    ann82.subtitle = @"Come check us out";
    ann82.coordinate = store82.center;
    [mapView addAnnotation:ann82];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #40
    MKCoordinateRegion store40;
    store40.center.latitude = 37.1236680;
    store40.center.longitude = -76.5093960;
    store40.span.latitudeDelta = 0.1;
    store40.span.latitudeDelta = 0.1;
    [mapView setRegion:store40 animated:YES];

    MillersLocations *ann40 = [[MillersLocations alloc]init];
    ann40.title = @"Store 40";
    ann40.subtitle = @"Come check us out";
    ann40.coordinate = store40.center;
    [mapView addAnnotation:ann40];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #55
    MKCoordinateRegion store55;
    store55.center.latitude = 36.7704630;
    store55.center.longitude = -76.6058140;
    store55.span.latitudeDelta = 0.1;
    store55.span.latitudeDelta = 0.1;
    [mapView setRegion:store55 animated:YES];

    MillersLocations *ann55 = [[MillersLocations alloc]init];
    ann55.title = @"Store 55";
    ann55.subtitle = @"Come check us out";
    ann55.coordinate = store55.center;
    [mapView addAnnotation:ann55];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #58
    MKCoordinateRegion store58;
    store58.center.latitude = 36.7818390;
    store58.center.longitude = -76.0479090;
    store58.span.latitudeDelta = 0.1;
    store58.span.latitudeDelta = 0.1;
    [mapView setRegion:store58 animated:YES];

    MillersLocations *ann58 = [[MillersLocations alloc]init];
    ann58.title = @"Store 58";
    ann58.subtitle = @"Come check us out";
    ann58.coordinate = store58.center;
    [mapView addAnnotation:ann58];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #57
    MKCoordinateRegion store57;
    store57.center.latitude = 36.8216160;
    store57.center.longitude = -76.4246680;
    store57.span.latitudeDelta = 0.1;
    store57.span.latitudeDelta = 0.1;
    [mapView setRegion:store57 animated:YES];

    MillersLocations *ann57 = [[MillersLocations alloc]init];
    ann57.title = @"Store 57";
    ann57.subtitle = @"Come check us out";
    ann57.coordinate = store57.center;
    [mapView addAnnotation:ann57];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //Miller's Neighborhood Market #90
    MKCoordinateRegion store90;
    store90.center.latitude = 38.1330690;
    store90.center.longitude = -77.5124230;
    store90.span.latitudeDelta = 0.1;
    store90.span.latitudeDelta = 0.1;
    [mapView setRegion:store90 animated:YES];

    MillersLocations *ann90 = [[MillersLocations alloc]init];
    ann90.title = @"Store 90";
    ann90.subtitle = @"Come check us out";
    ann90.coordinate = store90.center;
    [mapView addAnnotation:ann90];
    [MillersLocations release];
    //Not sure if release should be on this syntax

    //56,66,21,67,49,90,82,40,55,58,57

}

错误(线程1:程序接收信号“SIGABRT”。)总是在线上发生:

[mapView setRegion:store57 animated:YES];

或者在store90上也是如此。还有其他商店,它也发生在那条线上。没有我确定的押韵或理由。

感谢任何可以提供帮助的人!如果我有点啰嗦道歉,我只是想确保我提供了你需要帮助的任何信息。

修改

一旦我正确合成了我创建的MKMapView Outlet,然后得到了释放它的代码(“[mapView release];”),它就起作用了。我假设MapViews会自行释放,这可能是导致错误的原因。

它工作正常,然后我去添加另一个注释,它再次崩溃。当我删除它的新注释时,它会起作用,所以当我添加更多注释时会出现问题。 AG。任何帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:1)

SIGABRT最可能的原因是store49的区域无效,导致NSInvalidArgumentException和SIGABRT。

对于store49(以及之后的所有商店),未设置longitudeDelta 仅设置latitudeDelta(两次)。

将重复的latitudeDelta设置修复为longitudeDelta


另一个问题是:

[MillersLocations release];

这会尝试在release类上调用MillersLocation - 而不是您正在创建的类的实例。所有这些行都应改为:

[ann56 release];

此外,每次设置注释时都不需要创建区域。例如,您可以这样做:

MillersLocations *ann56 = [[MillersLocations alloc]init];
ann56.title = @"Store #56";
ann56.subtitle = @"Come check us out!";
ann56.coordinate = CLLocationCoordinate2DMake(36.8605679, -76.2866713);
[mapView addAnnotation:ann56];
[ann56 release];

添加所有注释后,您可以创建一个包含所有注释的区域(如果这是您想要的)或只显示最后一个注释,然后在结束时调用setRegion一次。

此外,您可能希望将商店存储在plist中并循环通过plist来创建注释,而不是在代码中单独创建它们。

最后,您不应删除[mapView release];(来自dealloc),即使它是IBOutlet。