cancelPreviousPerformRequestWithTarget n'annule mon fil précédemment retardé a commencé avec performSelector

StackOverflow https://stackoverflow.com/questions/2862293

Question

J'ai lancé un fil retardé en utilisant performSelector mais l'utilisateur a toujours la capacité de frapper le bouton de retour sur la vue actuelle cause dealloc à appeler. Lorsque cela se produit mon fil semble encore être appelé ce qui provoque mon application à l'accident parce que les propriétés que le fil est en train d'écrire à ont été libérés. Pour résoudre cela, je suis en train de cancelPreviousPerformRequestsWithTarget d'appel d'annuler la demande précédente, mais il ne semble pas fonctionner. Voici quelques extraits de code.

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

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

ce que je fais ici quelque chose d'incorrect? La méthode myStopUpdatingLocation est définie dans la même classe que j'appelle le traitement des requêtes.

Un peu plus de fond. La fonction que je suis en train de mettre en œuvre est de trouver un emplacement de l'utilisateur, la recherche google pour certains endroits autour de cet endroit et afficher plusieurs annotations sur la carte. Sur viewDidLoad je commence à mettre à jour l'emplacement avec CLLocationManager. J'ai construction dans un délai d'attente au bout de 6 secondes si je ne reçois pas mon précision voulue dans le délai et j'utilise un performSelector pour le faire. Ce qui peut arriver est que l'utilisateur clique sur le bouton de retour dans la vue et ce fil sera toujours exécuter même si toutes mes propriétés ont été libérés causant un accident.

Merci à l'avance!

James

Était-ce utile?

La solution

Je trouve mon problème, il n'a rien à voir avec mes appels à performSelector. Je trouve que vous devez définir votre Delgate de MKMapView et CLlocationManager à zéro avant de les libérer. Sinon, ils vont continuer à travailler même si vous avez publié les cas et ils ont la possibilité de planter votre application.

Merci pour votre aide! Noah.

Autres conseils

je suis tombé sur un problème similaire où je ne savais pas que j'ordonnancement plusieurs appels performSelector sur différents objets de sorte que le « soi » était différente dans chaque cas.

Je vous recommande de jeter un NSLog (@ "Self:% @", auto); 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];
}

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top