J'ai un cas d'utilisation où l'application tentera automatiquement de récupérer un emplacement, l'utilisateur peut refuser la permission, puis l'utilisateur peut déclencher l'application pour rechercher l'emplacement à nouveau (cette fois le permettant), mais l'application sera crash. Voici le code de base et les étapes de cas d'utilisation, ci-dessous, qu'est-ce que je fais de mal?CLLocationManager initialisant, libérant, initialisant puis relâchant provoque un crash?
@interface AppViewController : UIViewController <CLLocationManagerDelegate>{
CLLocationManager *locationManager;
}
@property (retain,nonatomic) CLLocationManager *locationManager;
//... method declaration
@end
@implementation AppViewController
@synthesize locationManager;
-(void)MethodThatAutomaticallyGetsLocation{
[self FindLocation];
}
-(IBAction)UserTriggerToGetLocation{
[self FindLocation];
}
-(void)FindLocation{
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[locationManager startUpdatingLocation];
}
-(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation{
// ... do some stuff
// ... save location info to core data object
[locationManager stopUpdatingLocation];
locationManager.delegate = nil;
[locationManager release];
}
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
// ... conditionally display error message
// based on type and app state
[locationManager stopUpdatingLocation];
locationManager.delegate = nil;
[locationManager release];
}
- (void)dealloc {
// locationManager not released here, its released above
}
@end
- charges App Voir, les messages
MethodThatAutomaticallyGetsLocation
FindLocation
est appelé à installerlocationManager
- Téléphone demande la permission de partager l'emplacement
- utilisateur refuse l'autorisation
locationManager:didFailWithError
est appelée, libèrelocationManager
- L'utilisateur interagit avec l'interface utilisateur, déclenche
(IBAction) UserTriggerToGetLocation
qui appelleFindLocation
- Téléphone demande la permission à nouveau, cette fois l'utilisateur permet
locationManager:didUpdateToLocation:fromLocation
fait son travail
Puis les plantages d'applications à l'intérieur locationManager:didUpdateToLocation:fromLocation
quand [locationManager release]
est appelé. Plus précisément, je reçois EXC_BAD_ACCESS
qui impliquerait locationManager
est déjà publié? mais où?
Qu'est-ce que j'ai fait de mal?