2010-08-10 68 views
0

我發佈了另一個類似的問題。這是我的舊代碼,因爲有些ppl會說它會更好,但是我沒有找到釋放分配內存的解決方案。iphone UIImage數組內存泄漏(舊)

imageArray_danceright = [[NSArray alloc] initWithObjects: 
[UIImage imageNamed:@"FrankieDanceRetime_0001.jpg"], 
.. 40 images 
[UIImage imageNamed:@"FrankieDanceRetime_00040.jpg"],nil]; 


imageArray_danceleft = [[NSArray alloc] initWithObjects: 
[UIImage imageNamed:@"FrankieDanceRetime_0041.jpg"], 
.. 40 images 
[UIImage imageNamed:@"FrankieDanceRetime_00080.jpg"],nil]; 

imageArray_stand= [[NSArray alloc] initWithObjects: 
[UIImage imageNamed:@"FrankieSingtRetime_0001.jpg"], 
[UIImage imageNamed:@"FrankieSingtRetime_0002.jpg"], 
[UIImage imageNamed:@"FrankieSingtRetime_0003.jpg"],nil]; 

//start animation 
myimageview.animationImages = imageArray_stand; 
myimageview.animationDuration = 0.23; 
myimageview.contentMode = UIViewContentModeBottomLeft; 
myimageview.animationRepeatCount = 0.0; 
myimageview.image = [myimageview.animationImages objectAtIndex:1]; 
[myimageview startAnimating]; 


- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    touch = [[event allTouches] anyObject]; 
    if ([touch view] == overlay_fuesserechts) { 
    [myimageview setAnimationImages:imageArray_danceright]; 
     myimageview.animationDuration = 2.0; 
     myimageview.contentMode = UIViewContentModeBottomLeft; 
     myimageview.animationRepeatCount = 1; 
     [myimageview startAnimating]; 
    } 
    if ([touch view] == overlay_fuesselinks) { 
    [myimageview setAnimationImages:imageArray_danceleft]; 
     myimageview.animationDuration = 2.0; 
     myimageview.contentMode = UIViewContentModeBottomLeft; 
     myimageview.animationRepeatCount = 1; 
    [myimageview startAnimating]; 
    } 

它的工作正常..只是當我看着儀器/分配,它不釋放內存。 它開始於8MB的'立場'動畫,上升到32MB的fuesserechts,當我點擊fuesselinks它上升到55MB(我有6更多的動畫..所以更多,它只是崩潰) 當我確定[myimageview setAnimationImages:nil]; (在touchesBegan)每個setAnimationImages ...我仍然不釋放內存。 Allocatoins總體字節數仍然增加。 當我設置[myimageview.animationImages發佈];在(touchesbegan)每個setAnimationImages ...它甚至在幾次觸碰後崩潰。

感謝 克里斯

+0

沒有代碼在哪裏釋放你的3個數組。你只創建一次或多次? – Vladimir 2010-08-10 13:40:32

回答

1

好吧,現在我看到你的原始代碼我想我看到了建議來自哪裏。您可能需要使用imageWithContentsOfFile:(而不是您之前的問題),而不是imageNamed:。前者緩存其圖像,而後者則不。雖然我不相信這是你的問題。

不太清楚的是此代碼適合您的大型系統。我認爲第一段代碼(所有imageNamed:調用)都在init方法中?是這樣嗎?

//start animation部分真的是在相同的方法或其他地方。這是不明確的,因爲您隨後將您的touchesBegan:方法完整包含在內。

您也不會顯示myimageview正在創建的位置 - 以及誰擁有它。如果你在同一個班級內創建它,那麼你也應該在dealloc中發佈它。談到dealloc它似乎從這個版本中缺少 - 是隻有在新版本?你需要它(更多)。

我知道很難明確地發佈代碼片段 - 但在這種情況下,我認爲這些是需要澄清的事情。

如果您的設置代碼(imageNamed:延伸段)每次都被調用,可能會很好地解釋它 - 因爲可能缺少釋放myimageview

+0

謝謝我會考慮它:) – 2010-08-10 14:42:23

+0

我停止使用ImageAnimation ..我花了數小時,仍然沒有成功。 現在我使用一個計時器,每個0.3秒呼叫一個循環,我只是分配和釋放一個圖像飛行..工作與流量和沒有內存泄漏:) 只是想知道我使用那裏 [myimageview.image release] ; myimageview.image = nil; \t \t \t myimageview.image = [UIImage imageNamed:[imageArray_spagat objectAtIndex:piccounter-1]]; 當我不設置myimageview.image =零;它也會在一段時間後崩潰..但爲什麼。無論如何,它將被分配一個命令? – 2010-08-10 15:08:10

1

在這段代碼中,它看起來像你可能初始化三個數組每一次點擊,但你永遠不釋放他們,所以數組只是內存堆疊起來。或者,你可能根本沒有保留陣列。我不能說,因爲代碼提供的數組初始化沒有上下文的類的其餘部分。

您應該使圖像數組保留類的屬性,以便您只初始化它們一次。使用self.表示法正確訪問它們,以保留它們。只在班級的釋放方法中釋放它們。

不要將發佈發送到其他對象的屬性。每個對象應專門管理自己的內存使用。在這種情況下,發送UIImageView的animationImages屬性版本是一個很大的錯誤。它幾乎總是會導致崩潰。

順便說一句,用大量imageNamed調用來初始化陣列是很危險的。如果特定圖像出現問題,您將很難跟蹤錯誤。相反,使用可變數組並使用for循環構建數組。這樣做會使代碼更加緊湊並使錯誤變得明顯。

+0

謝謝...我會看看..我也能dealloc ..但它的奇怪..在模擬器中它沒有,但在設備上它dealloc。但是,當我釋放每個動畫時,所以它必須重新加載完成,它變慢了..現在尋找另一個解決方案,並將儘可能避免「setAnimation」爲更大的一組圖像。謝謝 – 2010-08-10 13:19:05