3 votes

Le délégué de CLLocationManager n'est pas appelé

Je suis en train d'utiliser CLLocationManager sur un appareil et les méthodes du délégué ne sont pas appelées. Voici mon code (je peux voir que la classe n'est pas libérée non plus) :

#import 
#import 

@interface CurrentLocation : NSObject  {
    CLLocationManager *locationManager;

}
@property (nonatomic, retain) CLLocationManager *locationManager;  

@end

#import "CurrentLocation.h"
#import "SBJson.h"
@implementation CurrentLocation
@synthesize locationManager;

- (id)init
{
    self = [super init];
    if (self) {
        NSLog(@"Initialisé");
        locationManager = [[[CLLocationManager alloc] init] autorelease];
        locationManager.delegate = self;
        [locationManager startUpdatingLocation];
        BOOL enable = [CLLocationManager locationServicesEnabled];
        NSLog(@"%@", enable? @"Activé" : @"Non activé");
    }

    return self;
}

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation {
    NSLog(@"A");
    NSString *stringURL = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=true", newLocation.coordinate.latitude, newLocation.coordinate.longitude];
    NSLog(@"%@", stringURL);

    NSURL *url = [NSURL URLWithString:stringURL];

    NSData *data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:url] returningResponse:nil error:nil];

    SBJsonParser *parser = [[SBJsonParser alloc] init];
    NSDictionary *dict = [parser objectWithData:data];
    NSLog(@"%@", dict);
}

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

- (void)dealloc {
    NSLog(@"Désallocation appelée");
    [super dealloc];
    [locationManager release];
}

@end

Dans les logs, je vois :

2011-10-02 19:49:04.095 DixieMatTracker[1404:707] Initialisé
2011-10-02 19:49:04.109 DixieMatTracker[1404:707] Activé

Qu'est-ce que je fais de mal? Merci

6voto

Vous utilisez la variable locationManager, et pas la propriété ; cela signifie que le CLLocationManager n'est pas retenu et sera libéré car vous l'autorisez. Utilisez self.locationManager:

self.locationManager = [[[CLLocationManager alloc] init] autorelease];

3voto

Wizz Points 976

Je suggérerais que vous vérifiiez la gestion de la mémoire de votre instance CLLocationManager.

Écrivez-le ainsi :

#import "CurrentLocation.h"
#import "SBJson.h"
@implementation CurrentLocation
@synthesize locationManager;

- (id)init
{
    self = [super init];
    if (self) {
        NSLog(@"Initialisé");
        locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;
        [locationManager startUpdatingLocation];
        BOOL enable = [CLLocationManager locationServicesEnabled];
        NSLog(@"%@", enable? @"Activé" : @"Non activé");
    }

    return self;
}

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation {
    NSLog(@"A");
    NSString *stringURL = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=true", newLocation.coordinate.latitude, newLocation.coordinate.longitude];
    NSLog(@"%@", stringURL);

    NSURL *url = [NSURL URLWithString:stringURL];

    NSData *data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:url] returningResponse:nil error:nil];

    SBJsonParser *parser = [[SBJsonParser alloc] init];
    NSDictionary *dict = [parser objectWithData:data];
    NSLog(@"%@", dict);
}

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

- (void)dealloc {
    NSLog(@"Destructeur appelé");
    [super dealloc];
    [locationManager release];
}

@end

Le délégué n'est pas appelé car l'objet CLLocationManager est désalloué avant de pouvoir fournir une réponse à la demande de localisation. Cela est dû à l'autorelease dans votre code.

En outre, s'il est utilisé, il serait une erreur de le libérer manuellement dans dealloc. Cela pourrait entraîner des plantages inattendus.

La solution ci-dessus le fait 'à la main' en allouant un CLLocationManager dans init et en le libérant dans dealloc.

0voto

vir us Points 410

Dans mon cas, c'était parce que mon appareil n'était pas en mesure de déterminer l'emplacement - en restant à l'intérieur, le signal GPS était indisponible et le Wi-Fi était également déconnecté, donc le gestionnaire d'emplacement n'était tout simplement pas en mesure de recevoir de données de localisation et le délégué n'a jamais été appelé.

Une fois que j'ai connecté le Wi-Fi, cela a fonctionné (je suppose que se déplacer à l'extérieur devrait également fonctionner dans ce cas, mais parfois ce n'est pas très pratique :))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X