2013-07-25 83 views
0

我正在製作一個應用程序,就像電影播放器​​,但不是顯示視頻,而是在圖像幀中放映電影。滑塊用於向前和向後移動「電影」,如果釋放,則「電影」會自動播放到一個章節。 我通過在滑塊的每個值更改上使用UIImageView並更改image屬性來實現此目的。一段時間後,由於內存警告,應用程序崩潰。我不能使用UIImage的動畫,因爲我想通過清理滑塊來控制位置(即可見圖像/幀)。 因此,我有一個ImageManager類,它在init中加載數組中字符串中的所有圖像名稱(每個圖像總共大約150kb)。UIImageView由於內存警告而崩潰,試圖加載大量圖像

- (id) initWithCanvas:(UIImageView*) canvasView{ 
    self = [super init]; 
    if (self) { 
     totalImages = 1500; 
     self.canvas = canvasView; 
     self.images = [[NSMutableArray alloc] init]; 
     for (int i=0; i<totalImages; i++){ 
      [self.images addObject:[NSString stringWithFormat:@"frame_%04d.jpg", i]]; 
      i = i + 4; // I use this to skip 4 frames 
     } 
     previewsImageIndex = -1; 
     [self setImageAtPosition:0]; 
    } 
    return self; 
} 

然後我有一個在其上找到當前圖像名稱和構建從圖像名稱一個UIImage,並把它設置爲UIImageView的

- (void) setImageAtPosition:(CGFloat)percentage{ 
    currentImage = nil; 
    int position = percentage * [self.images count]; 
    if (position != previewsImageIndex){ 
     previewsImageIndex = position; 
     NSLog(@"Got image:%d at percentage: %f", position, percentage); 
     if (position < [self.images count]){ 
      self.canvas.image = nil; 
      currentImage = [UIImage imageNamed:[self.images objectAtIndex:position]]; 
      [self.canvas setImage:currentImage]; 
      currentImage = nil; 
      //[currentImage release]; 
     } 
    } 
} 

即使UISlider的值變化發射功能我將currentImage和canvas.image設置爲零,應用程序崩潰後不久。我不明白我在哪裏有內存泄漏。另外,我使用ARC編碼,因此沒有發佈。

有沒有其他更好的方式來做到這一點,除了有一個UIImage視圖?我想要逐幀查看功能,並且MPMoviePlayer或AVPlayer不能進行細粒度的清理。

+0

不要使用'imageNamed',因爲它會緩存你的圖片。 –

+0

請顯示'currentImage'的聲明。 –

+0

@MarcusAdams UIImage * currentImage;但它是''imageNamed'做了壞的東西 –

回答

1

您將需要使用[UIImage imageWithContentsOfFile:@""]方法,因爲它不會緩存圖像。 imageNamed:緩存通過它加載的所有圖像。

+0

它的工作!儘管我必須使用'NSString * fileLocation = [[NSBundle mainBundle] pathForResource:[self.images objectAtIndex:position] ofType:@「jpg」];''來獲取完整路徑。猜猜我應該更頻繁地閱讀文檔,因爲它在那裏描述了緩存 –

相關問題