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

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top