2009-08-24 6 views
1

J'ai travaillé à aplanir les fuites de mémoire dans mon programme et je suis à quelques traînards. La chose étrange est qu'ils viennent de quand j'utilise CoreLocation pour obtenir un emplacement GPS. Le code renvoie correctement l'emplacement, mais il fuit partout: CFHTTPMessage, CFURLConnection, CFURLRequest, CFURLResponse, GeneralBlock-16, -32, -48, HTTPRequest, etc ... Quelqu'un pourrait-il me guider pour résoudre ce problème?iPhone Help: Fuite de mémoire impaire dans CoreLocation Framework

Initialisation de MyCLController

locationController = [[MyCLController alloc] init]; 
locationController.delegate = self; 
[locationController.locationManager startUpdatingLocation]; 

Est-ce que certaines choses et obtenir un rappel par le délégué:

[locationController release]; 

MyCLController.h:

#import <Foundation/Foundation.h> 
@protocol MyCLControllerDelegate 
@required 
- (void)locationUpdate:(CLLocation *)location; 
- (void)locationError:(NSError *)error; 
@end 
@interface MyCLController : NSObject { 
    CLLocationManager *locationManager; 
    id delegate; 
} 
@property (nonatomic, retain) CLLocationManager *locationManager; 
@property (nonatomic, assign) id delegate; 

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation; 

- (void)locationManager:(CLLocationManager *)manager 
     didFailWithError:(NSError *)error; 
@end 

MyCLController.m:

#import "MyCLController.h" 
@implementation MyCLController 
@synthesize locationManager; 
@synthesize delegate; 

- (id) init { 
    self = [super init]; 
    if (self != nil) { 
     self.locationManager = [[[CLLocationManager alloc] init] autorelease]; 
     self.locationManager.delegate = self; // send loc updates to myself 
    } 
    return self; 
} 

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation { 
    [locationManager stopUpdatingLocation]; 

    [self.delegate locationUpdate:newLocation]; 
} 

- (void)locationManager:(CLLocationManager *)manager 
     didFailWithError:(NSError *)error { 
    [self.delegate locationError:error]; 
} 
- (void)dealloc { 
    [super dealloc]; 
} 
@end 

Répondre

3

Vous devez libérer le LocationManager. Assurez-vous que vous définissez son délégué sur NULL avant de le libérer. Et aussi, ce n'est pas une bonne idée de simplement retourner le premier résultat. Assurez-vous que la précision horizontale n'est pas < 0 et est également en dessous de certains seuils, comme 5000 mètres. Et pour le rendre plus robuste, vous pouvez ajouter une minuterie pour l'arrêter après un laps de temps donné, s'il ne trouve pas votre emplacement avec suffisamment de précision.

+0

Ceci est utile. – JonLeah

1

vous ne relâchez locationController

+0

Merci pour la réponse, mais ce n'est pas vraiment d'où la fuite vient, j'ai oublié de poster ma méthode dealloc. La fuite se produit exactement lorsque j'appelle startUpdatingLocation. [versionController]; – JonLeah