2011-06-13 69 views
0

我有一個平移手勢,可以在一系列圖像上平移。我不知道如何正確地管理這個內存,經過一段時間的平移之後,我得到了崩潰。加載圖像中的內存管理

animImage是一個UIImageView;

這裏是它如何工作的:

- (IBAction) panAnim:(UIPanGestureRecognizer *)sender{ 
    CGPoint translate = [sender translationInView:sliderView]; 

    if (translate.x >= lastPoint) { 
     difference = translate.x - lastPoint; 
     [self forwardAnim:difference]; 
    } else { 
     difference = lastPoint - translate.x; 
     [self backwardAnim:difference]; 
    } 
    lastPoint = translate.x; 
} 

-(void)forwardAnim:(CGFloat)speed{ 
    NSInteger newFrame = currentFrame+speed; 
    currentFrame = newFrame; 
    if (currentFrame>=totalFrames) { 
     currentFrame=0; 
    } 
    NSString *newImagePath = [NSString stringWithFormat:@"%@", [currentAnimation objectAtIndex:currentFrame]]; 
    animImage.image = [UIImage imageNamed:newImagePath]; 
} 

-(void)backwardAnim:(CGFloat)speed{ 
    NSInteger newFrame = currentFrame-speed; 
    currentFrame = newFrame; 
    if (currentFrame<0) { 
     currentFrame=(totalFrames-1); 
    } 
    NSString *newImagePath = [NSString stringWithFormat:@"%@", [currentAnimation objectAtIndex:currentFrame]]; 
    animImage.image = [UIImage imageNamed:newImagePath]; 
} 

動畫檢測的轉換位置,並計算出什麼「框架」的動畫應該是,然後換出的圖像。

我得到了一個非常流暢的動畫,但很明顯我導致崩潰,因爲我沒有正確管理內存。我收到內存警告,然後崩潰 - 但只有當我滾動瀏覽圖像一段時間。

我需要找出預先加載100張圖像的方法,所以我只能保留100張圖像的內存。這很奇怪,因爲圖像在儀器IO輸出中正確打開和關閉。

感謝您的幫助!

乾杯,d

+1

animImage是一個UIImageView嗎?乍一看,我沒有看到你發佈的代碼有什麼問題,而不是currentAnimation的索引問題。你有堆棧跟蹤嗎? – csano 2011-06-13 17:10:34

+0

是的animImage是一個UIImageView。如果這段代碼很好,那麼崩潰的原因可能就在別處。我會調查。乾杯 – 2011-06-14 07:36:37

+0

@ j0k問題的原因是內存不足警告,然後崩潰 - 這是因爲動畫。 – 2011-06-14 16:28:10

回答

1

+[UIImageView imageNamed:]緩存圖像加載,所以這並不奇怪,您的內存使用量不斷增加。您可以嘗試將這些+imageNamed:調用改爲改爲+imageWithContentsOfFile:。這可能會傷害您的動畫表現,但我懷疑您會看到內存使用量顯着下降。

內存警告並不意味着即將發生崩潰。如果你發佈了崩潰的細節,它會有所幫助。查看崩潰日誌,您應該能夠識別導致崩潰的代碼中的一行 - 它可能距棧頂幾幀。找到該行,在它之前放置一兩個斷點,然後逐步瀏覽代碼,想象每行可能發生的問題 - 分配失敗,錯誤值等。

順便說一句,你的25kB圖像文件可能擴展到內存中更大的內容。

+0

這個工程。自從我使用這個以來,我沒有遇到它。我沒有意識到'imageNamed:'的緩存 - 謝謝!我會在解鎖時獎賞賞金(21小時) – 2011-06-27 12:21:08

+0

太棒了,很高興我能幫上忙。儘管如此,請確保在低內存條件下進行徹底測試 - 即使內存不足,應用程序也不應該崩潰。切換到'+ imageWithContentsOfFile:'可能是一個有益的改變,但它也可能通過消除內存不足的情況來掩蓋真正的問題。 – Caleb 2011-06-27 12:55:43

+0

,因爲它是應用程序中唯一的功能(我還沒有建立它的很多功能),所以我不確定它是否掩蓋了一個問題 - 我認爲這是目前唯一的問題。現在這個問題已經修復,我可以繼續構建其餘的部分 – 2011-06-27 13:46:36