2010-04-28 8 views
5

mi hanno permesso NSZombie di e sto ottenendo il seguente messaggio nel mio console, quando sto facendo funzionare la mia domanda:memoria over-release problema quando sto animando UIView

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

Ecco il metodo che sta eseguendo l'animazione

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

Non sempre si verifica un incidente, solo qualche volta. Mi chiedo che cosa viene rilasciato?

+0

cercarlo nel backtrace. –

+0

Il backtrace mi consente solo di tornare al principale. Qualunque cosa dopo è tutto assemblaggio. –

+0

Prova a impostare alcuni punti di interruzione. –

risposta

15

Si dispone di un pool di autorelease che richiede di chiedere, si tratta di un thread separato? Se la risposta è sì, non puoi fare cose a UIView lì. UIKit non è thread-safe. Puoi fare altre cose come il calcolo delle posizioni o l'aggiornamento delle immagini che verranno successivamente visualizzate sullo schermo, ma qualsiasi cosa dell'interfaccia utente deve accadere nel thread principale.

Graphics and Drawing section of iPhone Application Programming Guide

+0

Si è corretto, questo è un thread separato. Voglio solo caricare un'immagine da un URL nel mio UIImageView. Se rimuovo il codice dell'animazione, caricherà solo le immagini a volte. –

+0

Avete in particolare bisogno di un thread separato per caricare un'immagine da un URL? Perché non usare solo un NSURLConnection asincrono o qualche altra classe con un pattern delegato? – Rengers

+0

anche questo è stato il mio problema, grazie per questo! – Epaga

6

È possibile utilizzare molto semplice controllo di sicurezza fof tutte le funzioni di fare qualcosa con UI:

-(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

Questo è un bel trucco, in realtà. Grazie! –

Problemi correlati