2010-05-19 2 views
6

Ich habe einen verzögerten Thread mit performSelector gestartet, aber der Benutzer hat weiterhin die Möglichkeit, die Zurück-Schaltfläche der aktuellen Ansicht zu drücken, wodurch dealloc aufgerufen wird. Wenn das passiert, scheint mein Thread immer noch aufgerufen zu werden, was dazu führt, dass meine App abstürzt, weil die Eigenschaften, zu denen Thread schreiben möchte, freigegeben wurden. Um dies zu beheben, versuche ich cancelPreviousPerformRequestsWithTarget anzurufen, um die vorherige Anfrage abzubrechen, aber es scheint nicht zu funktionieren. Im Folgenden finden Sie einige Code-Snippets.cancelPreviousPerformRequestWithTarget bricht meinen zuvor verzögerten Thread nicht ab, der mit performSelector gestartet wurde

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

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

Mache ich etwas falsch hier? Die Methode myStopUpdatingLocation ist in derselben Klasse definiert, in der ich die perform-Anfragen anrufe.

Ein wenig mehr Hintergrund. Die Funktion, die ich zu implementieren versuche, ist, einen Standort für den Benutzer zu finden, google nach bestimmten Orten in der Umgebung zu suchen und mehrere Anmerkungen auf der Karte anzuzeigen. Unter viewDidLoad beginne ich, den Standort mit CLLocationManager zu aktualisieren. Ich habe ein Timeout nach 6 Sekunden eingebaut, wenn ich nicht innerhalb des Timeouts meine gewünschte Genauigkeit erhalte und dafür eine performSelector benutze. Was passieren kann, ist, dass der Benutzer auf die Zurück-Schaltfläche in der Ansicht klickt und dieser Thread weiterhin ausgeführt wird, obwohl alle meine Eigenschaften freigegeben wurden und einen Absturz verursachen.

Vielen Dank im Voraus!

James

Antwort

4

ich mein Problem gefunden, es hat nichts mit meinen Anrufen perform zu tun. Ich habe festgestellt, dass Sie das Delgate von MKMapView und CLlocationManager auf null setzen müssen, bevor Sie sie freigeben. Andernfalls werden sie weiterarbeiten, obwohl Sie die Instanzen veröffentlicht haben und sie Ihre App zum Absturz bringen können.

Danke für Ihre Hilfe Noah !.

2

Ich stieß auf ein ähnliches Problem, wo ich nicht wusste, dass ich mehrere performSelector Aufrufe auf verschiedenen Objekten geplant hatte, so dass das "Selbst" in jedem Fall anders war.

Ich würde empfehlen, einen NSLog (@ "Self:% @", selbst) zu werfen; vor jedem Ihres Bits Code wie: Sie durchführen und zur Freigabe der Wähler auf demselben Objekt

- (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]; 
} 

das Sie erlaubt, die SELF-Instanzen zu vergleichen, um sicherzustellen.

Verwandte Themen