2010-06-25 7 views
0

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 
  1. charges App Voir, les messages MethodThatAutomaticallyGetsLocation
  2. FindLocation est appelé à installer locationManager
  3. Téléphone demande la permission de partager l'emplacement
  4. utilisateur refuse l'autorisation
  5. locationManager:didFailWithError est appelée, libère locationManager
  6. L'utilisateur interagit avec l'interface utilisateur, déclenche (IBAction) UserTriggerToGetLocation qui appelle FindLocation
  7. Téléphone demande la permission à nouveau, cette fois l'utilisateur permet
  8. 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?

Répondre

0

Guh, rien à faire. Je pense que suis faire quelque chose de mal avec libérer avant dealloc mais je réalise aussi que je n'ai pas besoin de sortir avant. En arrêtant simplement locationManager dans ses gestionnaires de réponse, je peux ensuite le redémarrer pour l'étape 6 en changeant UserTriggerToGetLocation pour appeler à nouveau [locationManager startUpdatingLocation] pas FindLocation.