В моем делегате приложения были созданы как объект контроллера карты, так и объект менеджера местоположения.
mapController = [[[MapController alloc] initWithFrame:CGRectMake(0, 0, 0, 0)] retain];
[self restartLocationManager];
Однако свойство цели диспетчера местоположений не устанавливается до тех пор, пока в этом коде не будет создан экземпляр диспетчера местоположений:
- (void) restartLocationManager {
if (locationManager)
[locationManager release];
locationManager = [[[CLLocationManager alloc] init] retain];
locationManager.purpose = NSLocalizedString(@"Location Service Purpose", nil);
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
[locationManager startUpdatingLocation];
}
Так что это был ключ к тому, что что-то в инициализации карты вызывало первое предупреждение.
Поскольку я отказался включать службы определения местоположения в первом предупреждении, контроллер карты инициализировался и увидел необходимость показать предупреждение. Это инициализация контроллера карты (он является частью одиночного файла и требует некоторой очистки в этом отношении, но игнорируя это ...):
- (id) initWithFrame:(CGRect)aFrame {
@synchronized(self) {
if (!theMap) {
if (!self) self = [super init];
theMap = [[[MKMapView alloc] initWithFrame:aFrame] retain];
theMap.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
theMap.showsUserLocation = YES;
theMap.delegate = self;
}
return self;
}
Проходя по коду, я увидел второе предупреждение, отображаемое при выполнении строки showUserLocation
. Мне придется немного больше тестировать, чтобы точно сузить его, но я думаю, что сейчас на правильном пути.