2010-04-28 7 views
5

J'ai permis de NSZombie et je reçois le message suivant dans ma console quand je me présente ma demande:Mémoire sur la libération problème quand je suis Animer UIView

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

Voici la méthode qui exécute l'animation

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

Je ne reçois pas toujours un plantage, seulement parfois. Je me demande ce qui se libère?

+0

chercher dans la rétrospection. –

+0

Le backtrace ne me permet que de revenir à la main. Tout ce qui suit est tout l'assemblage. –

+0

Essayez de définir des points d'arrêt. –

Répondre

15

Vous avez un groupe de libération automatique qui me demande si c'est un sujet séparé? Si la réponse est oui alors vous ne pouvez pas faire des choses à UIView là. UIKit n'est pas sûr pour les threads. Vous pouvez faire d'autres choses comme le calcul des positions ou la mise à jour des images que vous mettrez plus tard à l'écran, mais tout ce qui est nécessaire à l'interface utilisateur doit se produire dans le fil principal.

Graphics and Drawing section of iPhone Application Programming Guide

+0

Vous avez raison, ceci est un fil séparé. Je veux juste charger une image à partir d'une URL dans mon UIImageView. Si je supprime le code d'animation, il ne chargera que les images parfois. –

+0

Avez-vous spécifiquement besoin d'un fil séparé pour charger une image à partir d'une URL? Pourquoi ne pas simplement utiliser un NSURLConnection asynchrone ou une autre classe avec un modèle de délégué? – Rengers

+0

c'était aussi mon problème, merci pour cela! – Epaga

6

Vous pouvez utiliser très simple vérification de sécurité FoF toutes les fonctions qui font quelque chose avec l'interface utilisateur:

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

C'est un bon truc, en fait. Merci! –