2010-05-19 12 views
6

He lanzado un hilo retrasado usando performSelector pero el usuario todavía tiene la habilidad de presionar el botón Atrás en la vista actual haciendo que se llame a dealloc. Cuando esto sucede, parece que se ha llamado a mi hilo, lo que hace que la aplicación se bloquee porque las propiedades en las que está intentando escribir el hilo han sido liberadas. Para resolver esto, intento llamar al cancelPreviousPerformRequestsWithTarget para cancelar la solicitud anterior, pero parece que no funciona. A continuación se encuentran algunos fragmentos de código.cancelPreviousPerformRequestWithTarget no cancela mi thread previamente retrasado iniciado con performSelector

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

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

¿Estoy haciendo algo incorrecto aquí? El método myStopUpdatingLocation se define en la misma clase a la que llamo las solicitudes de ejecución.

Un poco más de fondo. La función que intento implementar es buscar la ubicación de un usuario, buscar en Google algunas ubicaciones alrededor de esa ubicación y mostrar varias anotaciones en el mapa. En viewDidLoad empiezo a actualizar la ubicación con CLLocationManager. He construido en un tiempo de espera después de 6 segundos si no obtengo la precisión deseada dentro del tiempo de espera y estoy usando un performSelector para hacer esto. Lo que puede suceder es que el usuario haga clic en el botón Atrás en la vista y este subproceso se ejecutará aunque todas mis propiedades se hayan liberado y se haya producido un bloqueo.

¡Gracias de antemano!

James

Respuesta

4

encontré mi problema, no tiene nada que ver con mis llamadas a performSelector. Descubrí que tienes que establecer el delgate de MKMapView y CLlocationManager en cero antes de liberarlos. De lo contrario, seguirán funcionando aunque hayas liberado las instancias y tengan el potencial de bloquear tu aplicación.

Gracias por su ayuda Noah !.

2

Me encontré con un problema similar en el que no sabía que estaba programando múltiples llamadas de selector de rendimiento en diferentes objetos por lo que el "yo" era diferente en cada caso.

Recomiendo tirar un NSLog (@ "Self:% @", self); antes de cada uno de sus fragmentos de código como:

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

que le permitirá comparar los casos SELF para asegurarse de que se está realizando y la liberación de los selectores en el mismo objeto.

Cuestiones relacionadas