2010-11-20 62 views
0

我有一個UITable,當我點擊一行時,我加載一組圖像。 我創建的圖像與UIImage imageWithData

UIImage *image = [UIImage imageWithData:data]; 

的問題是,曾經一次我點擊同一行,圖像被重新分配到內存中,就像如果沒有緩存它採用了無內存被釋放,所以分配的內存不斷增加。 (我在設備和仿真器上看到這個使用Inspector)

我釋放了所有東西,而且在叮噹聲中,一切看起來都很好。 重點是過了一段時間我的應用程序崩潰。

任何建議或想法?

編輯:

這裏是我認爲是產生這一問題的部分代碼:

UIView *main = [[[UIView alloc] initWithFrame:rectScrollView] autorelease]; 

    for (int i=0; i<[contentArray count]; i++) { 
     float targetWidth = rectScrollView.size.width; 
     float targetHeight = rectScrollView.size.height; 

     Link *tmp_link = [contentArray objectAtIndex:i]; 
     AsyncImageView* asyncImage = nil; 
     if(tmp_link!=nil){ 
      CGRect imageFrame = CGRectMake(targetWidth*i, 0, targetWidth, targetHeight); 
      //asyncImage = [[[AsyncImageView alloc] initWithFrame:imageFrame ] autorelease]; 
      asyncImage = [[AsyncImageView alloc] initWithFrame:imageFrame ]; 
      asyncImage.contentMode = UIViewContentModeScaleAspectFit; 
      NSURL* url = [NSURL URLWithString:[[IMG_SERVER_URL stringByAppendingString: tmp_link.url] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; 
      [asyncImage loadImageFromURL:url]; 
      [self.scrollView addSubview:(UIImageView *)asyncImage]; 
      [asyncImage release]; 
     } 

     if ([tmp_link.caption length] > 0 && asyncImage!=nil) { 
      float marginTop = 25; 

      UILabel *caption = [[UILabel alloc] init]; 
      caption.text = tmp_link.caption; 
      caption.textAlignment = UITextAlignmentCenter; 
      caption.textColor = [UIColor whiteColor]; 
      caption.font = [UIFont systemFontOfSize:12]; 
      caption.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.4]; 

      CGRect captionFrame = CGRectMake((i * targetWidth), marginTop+10, targetWidth, 20.0f); 
      caption.frame = captionFrame; 
      [self.scrollView addSubview:caption]; 
      [caption release]; 
     } 
     //[asyncImage release]; 
    } 
    [main addSubview:scrollView]; 
    [scrollView release]; 
    if (pageControlEnabledTop) { 
     rectPageControl = CGRectMake(0, 5, scrollWidth, 15); 
    } 
    else if (pageControlEnabledBottom) { 
     //rectPageControl = CGRectMake(0, (scrollHeight - 25), scrollWidth, 15); 
     rectPageControl = CGRectMake(0, (scrollHeight), scrollWidth, 15); 
    } 
    if (pageControlEnabledTop || pageControlEnabledBottom) { 
     //pageControl = [[[UIPageControl alloc] initWithFrame:rectPageControl] autorelease]; 
     pageControl = [[UIPageControl alloc] initWithFrame:rectPageControl]; 
     pageControl.numberOfPages = [contentArray count]; 
     pageControl.currentPage = page; 
     [main addSubview:pageControl]; 
     [pageControl release]; 
    } 
    if (pageControlEnabledTop || pageControlEnabledBottom || rememberPosition) self.scrollView.delegate = self; 
    //if (margin) [margin release]; 
    return (UIScrollView *)main; 

而且它使用的是這樣的:

reviewImagesImage = [[IGUIScrollViewImage alloc] init]; 
     if([currentReview.linkScreenshots count]>0){ 

      //reviewImages 
      reviewImages = [[UIView alloc] init]; 

      //placing the images 
      CGRect frameImages = reviewImages.frame; 
      frameImages.origin.x = 10; 
      frameImages.origin.y = (infoView.frame.origin.y + infoView.frame.size.height + 10.0f); 
      frameImages.size.width = 300; 
      frameImages.size.height = 350.0f; 
      reviewImages.frame = frameImages; 
      reviewImages.backgroundColor = [UIColor clearColor]; 
      [reviewImagesImage setContentArray:currentReview.linkScreenshots]; 
      [reviewImagesImage setWidth:reviewImages.frame.size.width andHeight: reviewImages.frame.size.height]; 
      [reviewImagesImage enablePageControlOnBottom]; 
      [reviewImagesImage setBackGroudColor: [UIColor clearColor]]; 
      UIScrollView *tmp_sv = [reviewImagesImage getWithPosition:0]; 
      [reviewImages addSubview:tmp_sv]; 
      [self.view addSubview:reviewImages]; 
        [reviewImages release]; 
     } 

我注意到,如果我嘗試發佈reviewImagesImage我的應用程序崩潰:/

+0

你能發表更多的代碼嗎?也許你還沒有在任何地方發佈你的數據? – v01d 2010-11-21 01:25:02

+0

你什麼時候發佈你的'reviewImage'? – tia 2010-11-21 12:32:51

+0

好點,我發佈後[self.view addSubview:reviewImages]; [reviewImages release]; – 0m4r 2010-11-21 12:46:46

回答

1

當然,沒有緩存是我們因爲每次都會從數據創建新的UIImage。如果內存使用情況像您所說的那樣顯着增加,那麼最有可能的是,無意中將引用保留在某個地方是我們的錯。

+0

好吧,謝謝你的回答...但我希望在一些建議如何解決這個問題... – 0m4r 2010-11-20 21:37:34

+0

發佈一些更多的代碼?運行在泄漏?這聽起來像你大概顯示它的UIImageView沒有被釋放,如果它是一個IBOutlet加載到一個未在'-dealloc'中發佈的nib,可能會發生。 – 2010-11-21 06:36:59

+0

當發生這種情況時,我只是看我的代碼,以找到我可能出錯的地方。然後,如果這不起作用,我會嘗試刪除可疑的部分,直到我的應用程序運行良好,所以我知道罪魁禍首在哪裏。如果您可以發佈更多代碼,這裏的人可能會提供幫助。 – tia 2010-11-21 06:40:12

0

image設置爲imageWithData後,請將應用程序包中的image保存爲filepath