CLLocationManager не вызывает никаких методов делегата - PullRequest
1 голос
/ 16 сентября 2011

Во-первых, заявление об отказе от ответственности заключается в том, что я нацеливаюсь на iOS 5, так что очень хорошо может быть источником моих проблем, но если нет ...

Я пытаюсь написать простой класс, которыйуправляет обновлениями местоположения через CoreLocation.Тем не менее, я вижу довольно странное поведение.У меня есть собственный класс, который в основном обертывает CLLocationManager и методы делегата.Это интерфейс:

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

@protocol CLZipCodeFetcherDelegate
@optional - (void)didReceiveZipCode:(NSString *)zipCode;
@end

@interface CLZipCodeFetcher : NSObject <CLLocationManagerDelegate> {
    id <CLZipCodeFetcherDelegate> delegate;
    CLLocationManager *locationManager;
}

@property (strong, readwrite) id <CLZipCodeFetcherDelegate> delegate;
@property (strong, read write) CLLocationManager *locationManager;

- (void)getZipCode;

@end

и реализация (игнорируйте вещи, связанные с почтовым индексом - это то, что в конечном итоге и должен делать класс, но сейчас я просто пытаюсь вернуть некоторые координаты из CoreLocation):

#import "CLZipCodeFetcher.h"

@implementation CLZipCodeFetcher

@synthesize delegate, locationManager;

- (id) init {
    self = [super init];
    if (self != nil) {
        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
        self.locationManager.distanceFilter = 10.0f; // we don't need to be any more accurate than 10m
        self.locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
        self.locationManager.purpose = @"Retrieve zip code";
    }
    return self;
}



- (void)getZipCode {
    [self.locationManager startUpdatingLocation];
}



- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    NSLog(@"Received location");
}



- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    NSLog(@"Location failed");
}

@end

И затем я инициализирую экземпляр класса в моем контроллере представления и вызываю метод:

CLZipCodeFetcher *zipCodeFetcher = [[CLZipCodeFetcher alloc] init];
[zipCodeFetcher getZipCode];

Теперь, когда я запускаю это, приложение занимает некоторое времязагрузить, а затем всплывает диалоговое окно с предупреждением, запрашивающее разрешение на использование приложением служб определения местоположения.Однако, как только он появляется, он немедленно исчезает (слишком быстро, чтобы позволить мне нажать кнопку разрешения или отказа), и ничего не происходит (методы делегата не вызываются).Если я затем захожу в настройки местоположения устройства, оно действительно показывает «Выкл» для моего приложения.Когда я включаю его вручную с этого экрана и затем снова пытаюсь попробовать приложение, диалоговое окно с предупреждением не появляется, но все равно ничего не происходит.Ни одно из моих сообщений отладки не зарегистрировано.Поведение на симуляторе и на моем iPhone 4 одинаково.

Так что, в принципе, у кого-нибудь есть идеи, почему?Я просмотрел все подобные потоки, и многие проблемы были связаны с управлением памятью, но я не думаю, что это будет проблемой, поскольку ARC должен управлять моим объектом CLLocationManager, верно?

PSКроме того, я добавил инфраструктуру CoreLocation в свой проект и не получаю ошибок или предупреждений в коде, но нужно ли что-то еще сделать перед использованием CoreLocation в моем приложении?

Ответы [ 2 ]

10 голосов
/ 16 сентября 2011

ARC освобождает ваш вновь созданный объект после вызова метода getZipCode.

0 голосов
/ 16 сентября 2011

Я еще не использовал ARC, поэтому я не уверен в вашем синтаксисе в заголовке (чтение-запись или чтение-запись).

Но я бы поставил NSLog (@ "мой менеджер локальных сетей% @", self.locationManager); внутри getZipCode просто для того, чтобы убедиться, что он у вас есть, и он не будет выпущен, пока у него не будет возможности что-либо сделать.

...