2012-01-31 16 views
2

我觀看了有關在UIScrollView上實現平鋪的WWDC 2010 104會議,並試圖通過一些更改來實現它,但我遇到了實際內存問題 - 我將UIImageView作爲子視圖添加到UIScrollView,我甚至嘗試刪除超級添加後立即查看 - 並且我還沒有清理我的真實內存。 可能是autoreleasing有問題嗎?UIScrollView和真實內存

- (void)tilePages 
{ 
    [scrollView setContentSize:CGSizeMake(scrollView.bounds.size.width * [images count], scrollView.bounds.size.height)]; 

    CGRect visibleBounds = scrollView.bounds; 
    int firstNeededPageIndex = floorf(CGRectGetMinX(visibleBounds)/CGRectGetWidth(visibleBounds)); 
    int lastNeededPageIndex = floorf((CGRectGetMaxX(visibleBounds)-1)/CGRectGetWidth(visibleBounds)); 
    firstNeededPageIndex = MAX(firstNeededPageIndex, 0); 
    lastNeededPageIndex = MIN(lastNeededPageIndex, ([images count] - 1)); 

    for (ImageScrollView *page in visiblePages) { 
     if (page.index < firstNeededPageIndex || page.index > lastNeededPageIndex) { 
      [recycledPages addObject:page]; 
      [page removeFromSuperview]; 
     } 
    } 

    [visiblePages minusSet:recycledPages]; 

    for (int index = firstNeededPageIndex; index <= lastNeededPageIndex; index++) { 
     if (![self isDisplayingPageForIndex:index]) { 
      ImageScrollView *page = [self dequeueRecycledPage]; 
      if (page == nil) { 
       page = [[[ImageScrollView alloc] init] autorelease]; 

       [page setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight]; 

       if (self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
        [page setContentMode:UIViewContentModeScaleAspectFill]; 
       } 
       else { 
        [page setContentMode:UIViewContentModeScaleAspectFit]; 
       } 
      } 
      [self configurePage:page forIndex:index]; 

      [scrollView addSubview:page]; 

      [visiblePages addObject:page]; 
     } 
    }  
} 

- (ImageScrollView *)dequeueRecycledPage 
{ 
    ImageScrollView *page = [recycledPages anyObject]; 
    if (page) { 
     [[page retain] autorelease]; 
     [recycledPages removeObject:page]; 
    } 
    return page; 
} 

- (BOOL)isDisplayingPageForIndex:(NSUInteger)index 
{ 
    BOOL foundPage = NO; 
    for (ImageScrollView *page in visiblePages) { 
     if (page.index == index) { 
      foundPage = YES; 
      break; 
     } 
    } 
    return foundPage; 
} 

- (void)configurePage:(ImageScrollView *)page forIndex:(NSUInteger)index 
{ 
    page.index = index; 
    page.frame = [self frameForPageAtIndex:index]; 
    [page displayImage:[self imageAtIndex:index]]; 
} 

- (CGRect)frameForPagingScrollView 
{ 
    CGRect frame = scrollView.bounds; 
    return frame; 
} 

- (CGRect)frameForPageAtIndex:(NSUInteger)index { 
    CGRect pagingScrollViewFrame = [self frameForPagingScrollView]; 

    CGRect pageFrame = pagingScrollViewFrame; 
    pageFrame.origin.x = (pagingScrollViewFrame.size.width * index); 
    return pageFrame; 
} 

- (UIImage *)imageAtIndex:(NSUInteger)index { 
    return [images objectAtIndex:index]; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    self.scrollView = nil; 
    self.textView = nil; 
} 

- (void)dealloc 
{ 
    [super dealloc]; 
    [scrollView release]; 
    [images release]; 
    [recycledPages release]; 
    [visiblePages release]; 
} 
+2

您應該編輯您的問題以顯示如何(在代碼中)創建視圖並添加它們。另外,你使用的是ARC嗎?是什麼促使你的問題開始?您是否收到內存警告和崩潰(當您嘗試加載大量高分辨率或相當大的圖像時可能會發生這種情況)。 – 2012-01-31 09:50:46

+0

我加了我的代碼。不,我沒有使用ARC。 – 2012-01-31 10:13:30

+0

這很好(除了瘋狂的代碼格式化部分),但我也希望能從你那裏得到更多的解釋:是什麼促使你的問題開始?你是否收到內存警告或崩潰?你在使用ARC嗎? – 2012-01-31 10:15:54

回答

0

您已經正確實施演示,除了一部分。內存應該是在線

[visiblePages minusSet:recycledPages]; 

但我可以看到,你正在存儲在一個數組中的圖像。您的圖像正在被該陣列保留,並且沒有被釋放,因此正在佔用內存。

此代碼的目標是在需要時懶惰地加載圖像。您不會發布您初始化圖像陣列的位置,而是根據您的圖像預先填充圖像。

相反,你應該成像路徑存儲陣列中(你用它做的一切至今仍然有效),然後更改下面的方法:

- (UIImage *)imageAtIndex:(NSUInteger)index { 
    NSSting * imagePath = [images objectAtIndex:index]; 
    UIImage * image = [UIImage imageWithContentsOfFile:imagePath]; 
    return image; 
} 

或者其他類似的效果。根據圖像來自哪裏,可能會有更有效的圖像加載方式,但上面的方法應該能夠阻止圖像崩潰。

如果您的圖片需要很長時間才能加載並阻止您的界面,則可以執行一些操作。您可以使用GCD將圖像加載卸載到後臺線程,或者您可以繼續觀看該WWDC視頻並實現高分辨率圖像的CATiledLayer並將其放置在低分辨率圖像上。圖像將以非常快的速度顯現出來。

+0

它似乎是解決方案,提前tnx。 – 2012-02-01 08:36:07