estrellarse UIAlertView en el método indocumentado
-
24-09-2019 - |
Pregunta
Nuestra aplicación ha sido chocando con una frecuencia de aproximadamente 1 de cada 1.500 lanzamientos debido a un error que está resultando difícil de alcanzar. Se incluye la porción correspondiente de la traza de la pila. Se trata de ser despedido como una devolución de llamada así que no tengo referencia de donde está ocurriendo en mi propio código.
Parece que lo que está pasando es que hay un objeto que está llamando UIViewAnimationState
método privado UIAlertView's
(_popoutAnimationDidStop:finished:
). El único problema es, parece que el UIAlertView
se ha dealloced por este punto. No hago nada raro con vistas de alertas. Las tiro, y espero a la entrada del usuario. Todos ellos se muestran antes de ser liberado.
Cualquier persona encontró esto? En este punto, me estoy inclinando hacia él ser un error de Apple.
Thread 0 Crashed:
0 libobjc.A.dylib 0x3138cec0 objc_msgSend + 24
1 UIKit 0x326258c4 -[UIAlertView(Private) _popoutAnimationDidStop:finished:]
2 UIKit 0x324fad70 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
3 UIKit 0x324fac08 -[UIViewAnimationState animationDidStop:finished:]
4 QuartzCore 0x311db05c run_animation_cal
lbacks
Solución
Es probable que UIAlertView está intentando llamar a un método en su delegado después de que el delegado ha sido puesto en libertad. Para evitar este tipo de errores, cada vez que establece un objeto como delegado de otro objeto, establezca la propiedad delegado a cero en el método dealloc del objeto delegado. por ejemplo.
@implementation YourViewController
@synthesize yourAlertView;
- (void)dealloc {
yourAlertView.delegate = nil; // Ensures subsequent delegate method calls won't crash
self.yourAlertView = nil; // Releases if @property (retain)
[super dealloc];
}
- (IBAction)someAction {
self.yourAlertView = [[[UIAlertView alloc] initWithTitle:@"Pushed"
message:@"You pushed a button"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil] autorelease];
[self.yourAlertView show];
}
// ...
@end