2010-04-28 47 views
5

我已經啓用NSZombie的,當我運行我的應用程序,我在我的控制檯得到以下信息:內存過放的問題,當我動畫的UIView

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

這裏是正在執行動畫的方法

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

我並不總是崩潰,只是有時候。我想知道什麼是發佈?

+0

看看它的回溯。 – 2010-04-28 02:07:54

+0

回溯只讓我回到主線。之後的任何事情都是組裝。 – 2010-04-28 02:09:59

+0

嘗試設置一些斷點。 – 2010-04-28 02:14:16

回答

15

你有一個autorelease池那裏提示我問,這是一個單獨的線程?如果答案是肯定的,那麼你不能在那裏做UIView的東西。 UIKit不是線程安全的。你可以做其他事情,比如計算位置或更新後來放在屏幕上的圖像,但是任何用戶界面的東西都必須在主線程中發生。

Graphics and Drawing section of iPhone Application Programming Guide

+0

你是對的,這是一個單獨的線程。我只想從我的UIImageView中的URL中加載圖像。如果我刪除動畫代碼,它只會有時加載圖像。 – 2010-04-28 05:56:24

+0

您是否特別需要一個單獨的線程來從URL加載圖像?爲什麼不使用異步NSURLConnection或其他具有委託模式的類? – Rengers 2010-04-28 09:37:26

+0

這也是我的問題,非常感謝! – Epaga 2011-07-27 20:11:06

6

您可以用很簡單的安全檢查FOF做一些與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

這實際上是一個很好的技巧。謝謝! – 2011-09-11 21:58:30