2010-05-19 5 views
6

J'ai lancé un thread retardé en utilisant performSelector mais l'utilisateur a toujours la possibilité d'appuyer sur le bouton Précédent de la vue actuelle pour que dealloc soit appelé. Lorsque cela se produit, mon thread semble toujours appelé, ce qui provoque le blocage de mon application car les propriétés auxquelles ce thread essaie d'écrire ont été libérées. Pour résoudre ce problème, j'essaie d'appeler le cancelPreviousPerformRequestsWithTarget pour annuler la demande précédente mais cela ne semble pas fonctionner. Voici quelques extraits de code.cancelPreviousPerformRequestWithTarget n'annule pas mon thread précédemment retardé démarré avec performSelector

- (void) viewDidLoad { 
    [self performSelector:@selector(myStopUpdatingLocation) withObject:nil afterDelay:6]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
     [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myStopUpdatingLocation) object:nil]; 
    } 

Est-ce que je fais quelque chose de mal ici? La méthode myStopUpdatingLocation est définie dans la même classe que j'appelle les demandes d'exécution.

Un peu plus de fond. La fonction que j'essaie de mettre en œuvre est de trouver un emplacement d'utilisateurs, de rechercher google pour certains endroits autour de cet emplacement et d'afficher plusieurs annotations sur la carte. Sur viewDidLoad je commence à mettre à jour l'emplacement avec CLLocationManager. J'ai construit dans un délai d'attente après 6 secondes si je ne reçois pas la précision désirée dans le délai d'attente et j'utilise un performSelector pour ce faire. Ce qui peut arriver est que l'utilisateur clique sur le bouton de retour dans la vue et que ce thread s'exécutera même si toutes mes propriétés ont été libérées causant un plantage.

Merci d'avance!

James

Répondre

4

J'ai trouvé mon problème, il n'a rien à voir avec mes appels à performSelector. J'ai trouvé que vous devez définir votre delgate MKMapView et CLlocationManager à zéro avant de les libérer. Sinon, ils continueront à fonctionner même si vous avez publié les instances et qu'elles risquent de provoquer le blocage de votre application.

Merci pour votre aide Noah !.

2

J'ai rencontré un problème similaire lorsque je ne savais pas que je planifiais plusieurs appels performSelector sur différents objets de sorte que le "moi" était différent dans chaque cas.

Je recommande de lancer un NSLog (@ "Self:% @", self); avant chacun de vos morceaux de code tels que:

- (void) viewDidLoad { 
    NSLog(@"Self: %@",self); before 
    [self performSelector:@selector(myStopUpdatingLocation) withObject:nil afterDelay:6]; 
} 

- (void) viewWillDisappear:(BOOL)animated { 
    NSLog(@"Self: %@",self); before 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myStopUpdatingLocation) object:nil]; 
} 

qui vous permettra de comparer les instances AUTONOMES pour vous assurer effectuez et de libérer les sélecteurs sur le même objet.