0

I have a GPSTestViewController class that has a MKMapView with added MKAnnotations (stored in a class called Bases). I'm trying to continuously update the coordinates for the MKAnnotations (with the updateBaseInformation method in Bases) so the bases is moving on the map. The update is invoked from the GPSTestViewController method locationUpdate (since it's called every second):

- (void)locationUpdate:(CLLocation *)location {
    NSLog(@"locationUpdate");
    self.cachedLocation = location;
    [self centerTo:cachedLocation.coordinate];
    //Trying to update the coordinates every second
    [bases updateBaseInformation];   <--Program received signal: “EXC_BAD_ACCESS”
    return;
}

But then I get the following message: [bases updateBaseInformation]; Program received signal: “EXC_BAD_ACCESS”</p>

Bases.m contains the following code (and even when some code is commented it crashes):

- (void)updateBaseInformation {
   NSLog(@"Updating base information");
   for(MyAnnotation *a in bases)
   {
       //CLLocationCoordinate2D c;
       if([a.type compare:@"friend"] == 0)
       {
           //c.latitude = a.coordinate.latitude+0.001;
           //c.longitude = a.coordinate.longitude+0.001;
           //a.coordinate = c;
       }
       else if([a.type compare:@"enemy"] == 0)
       {
       //[a setCoordinate:CLLocationCoordinate2DMake(a.coordinate.latitude+0.002, a.coordinate.longitude+0.0012)];
       }
   }

}

My guess is that I'm accessing the objects that are already accessed somewhere else and that causes the EXC_BAD_ACCESS. I have spent many hours on searching, but without results. Why do I get this error and how should I do in order to make the Annotations move around on the map?

I have uploaded the complete project to (link removed).

Solution The problem is now solved. The problem was that the array that holds the Annotations was autoreleased. So I changed the allocation from

bases = [NSMutableArray array];

to

bases = [[NSMutableArray array] retain];

Thanks in advance.

4

1 回答 1

0

我的猜测是我正在访问已经在其他地方访问过的对象

您可能正在访问一个不再存在于内存中的对象 - 您需要检查您没有释放您随后访问的对象。您应该为您的方案打开 Zombies,这将允许您通过在对象被解除分配后有效地保持对象的内存处于监视之下来查看何时访问被解除分配的对象。您可以在此处打开它们:方案/编辑方案/启用僵尸对象。

于 2012-01-24T21:01:54.193 回答