2010-04-28 11 views
5

me han permitido NSZombie de y yo estoy recibiendo el siguiente mensaje en mi consola cuando estoy corriendo mi solicitud:Memoria sobre-liberación problema cuando estoy animando UIView

*** -[UIViewAnimationState release]: message sent to deallocated instance 0xf96d7e0 

Aquí es el método que va a realizar la animación

-(void)loadAvatar:(STObject*)st 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  

    avatar.alpha = 0; 
    avatar.frame = avatarRectSmall; 

    avatar.image = [ImageCache getMemoryCachedImageAtUrl:st.avatar_url]; 

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:.50]; 

    avatar.frame = avatarRectNormal; 
    [avatar setAlpha:1]; 
    [UIView commitAnimations]; 


    [pool release]; 
    pool = nil; 
} 

No siempre tengo un accidente, solo a veces. Me pregunto qué se va a lanzar?

+0

búsquelo en la traza. –

+0

El backtrace solo me permite volver al main. Cualquier cosa después de eso es todo ensamblaje. –

+0

Intenta establecer algunos puntos de interrupción. –

Respuesta

15

Tiene un grupo de autorrelease allí que me pide que pregunte, ¿se trata de un hilo por separado? Si la respuesta es sí, entonces no puedes hacer cosas allí con UIView. UIKit no es seguro para subprocesos. Puede hacer otras cosas, como calcular posiciones o actualizar imágenes que luego colocará en la pantalla, pero cualquier cosa de la interfaz de usuario tiene que suceder en el hilo principal.

Graphics and Drawing section of iPhone Application Programming Guide

+0

Tiene razón, este es un hilo separado. Solo quiero cargar una imagen desde una URL en mi UIImageView. Si elimino el código de animación, solo cargará las imágenes algunas veces. –

+0

¿Necesita específicamente un hilo separado para cargar una imagen desde una URL? ¿Por qué no usar simplemente un NSURLConnection asincrónico o alguna otra clase con un patrón de delegado? – Rengers

+0

este fue mi problema también, ¡gracias por esto! – Epaga

6

Puede utilizar controles de seguridad muy simple placa de fibra óptica todas las funciones que hacen algo con la interfaz de usuario:

-(void)functionModifyingUIelements:(id)object 
{ 
// fire itself in main thread if it is not in it already 
if (![[NSThread currentThread] isMainThread]) { 

     [self performSelectorOnMainThread:@selector(functionModifyingUIelements:) withObject:object waitUntilDone:NO]; 
     return; 
    } 

} 
+0

Este es un buen truco, en realidad. ¡Gracias! –

Cuestiones relacionadas