0

我一直在使用 MKMapView 并在地图上放置注释图钉。我正在努力在地图中为 30 个不同的位置放置 30 个图钉,并确保在添加每个附加位置后运行 iPhone SDK。然后,不知从何而来,它开始崩溃并给了我可怕的“SIGABRT”。啊!!

我知道这可能是我的语法中的一个小错误,但由于我只是在复制和粘贴以前有效的代码,所以我很茫然。我正在考虑使用 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 动画:YES];

或者也在 store90 上。还有其他商店也发生过这种情况,但总是在那条线上。没有我已经确定的押韵或理由。

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

编辑

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

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

4

1 回答 1

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];(from ) 是一个 IBOutlet ,也不应该删除它。dealloc

于 2011-10-11T18:10:05.667 回答