2010-04-28 10 views
5

Ich habe NSZombie ist aktiviert und ich erhalte die folgende Meldung in meiner Konsole, wenn ich meine Bewerbung leite:Speicher über Release Problem, wenn ich Animieren bin UIView

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

Hier ist die Methode, die die Animation ausführt

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

Ich bekomme nicht immer einen Absturz, nur manchmal. Ich frage mich, was veröffentlicht wird?

+0

Schauen Sie es oben in der Backtrace. –

+0

Das Backtrace lässt mich nur zum Haupt zurückgehen. Alles danach ist alles Montage. –

+0

Versuchen Sie, einige Haltepunkte festzulegen. –

Antwort

15

Sie haben einen Autorelease-Pool, der mich auffordert zu fragen, ist das ein separater Thread? Wenn die Antwort ja ist, dann können Sie dort nichts an UIView tun. UIKit ist nicht threadsicher. Sie können andere Dinge tun, wie das Berechnen von Positionen oder das Aktualisieren von Bildern, die Sie später auf den Bildschirm legen, aber jede Benutzerschnittstelle muss im Hauptthread passieren. etwas mit UI fof alle Funktionen sehr einfache Sicherheitsüberprüfung verwenden, tun

Graphics and Drawing section of iPhone Application Programming Guide

+0

Sie haben Recht, das ist ein separater Thread. Ich möchte nur ein Bild von einer URL in meinem UIImageView laden. Wenn ich den Animationscode entferne, werden nur manchmal die Bilder geladen. –

+0

Benötigen Sie speziell einen separaten Thread zum Laden eines Bildes von einer URL? Warum verwenden Sie nicht einfach eine asynchrone NSURLConnection oder eine andere Klasse mit einem Delegatenmuster? – Rengers

+0

das war mein Problem auch, danke dafür! – Epaga

6

Sie können:

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

Das ist eigentlich ein netter Trick. Vielen Dank! –