Я думаю, что у вас недостаточно памяти или вы столкнулись с ошибкой в MapKit.Но в его защиту не похоже, что вы используете наложения и представления MK правильно и перегружаете MKMapView, отслеживая так много потенциальных наложений.Дело в точке.При следующем методе вы добавляете 50 оверлеев к текущему местоположению:
-(void)addOverlays
{
CLLocation *currentLocation = self.mapView.userLocation.location;
for(int i = 0; i < 50; i++)
{
MKCircle *circle = [MKCircle circleWithCenterCoordinate:currentLocation.coordinate radius:50];
[self.mapView addOverlay:circle];
}
}
со временем это может добавить к большому количеству оверлеев, которые MKMapView должен отслеживать, и MKView, которые он потенциально долженпоказывать сразу.С вашим примером кода и симулятором местоположения симулятора iPhone простой маршрут езды на велосипеде собрал более 1800 MKCircle и MKCircleViews в MKMapView.
Вот пара моментов, о которых следует помнить:
- Не добавляйте столько оверлеев в каждой локации.1 достаточно.50 - это излишество.
- Для каждого местоположения должно быть достаточно одного MKCircle.Не уверен, почему вы решили отслеживать и рисовать так много кругов в каждом месте.
- Постарайтесь более эффективно передавать наложения в MapView.Дайте ему только те наложения, которые необходимы для той части карты, которую он показывает.Посмотрите видео WWDC2011 «Сессия 111 - Географическая визуализация информации с помощью MapKit», в котором показано, как оптимизировать этот код или пример кода HazardMap.
Вы можете сделать что-то вроде этого:
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// Add it to an NSArray that you use to keep track of ALL the overlays
[self.allOverlays addObject: MKCircle *circle = [MKCircle circleWithCenterCoordinate:currentLocation.coordinate radius:50]];
// Now add it to the mapView if it is in the current region
// code to check to see if currentLocation is within the current map region
if (overlayIsInMapRegion){
[mapView addOverlay: circle];
}
}
Затем, когда регион изменяется, вычислите наложения, которые необходимы, когда MapView вызывает метод делегата:
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
получите регион из mapView и создайте массив наложений, которые расположены в этом регионе.,Что-то вроде:
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
// Create a method that takes the region and calculates which overlays it contains
NSArray *newOverlays=[self overlaysForRegion: mapView.region fromAllOverlays: self.allOverlays];
if ([newOverlays count]>0){
[mapView removeOverlays];
[mapView addOverlays: newOverlays];
}
}
Надеюсь, это поможет.Удачи!
Тим