UIScrollView延迟加载图像以减少内存使用并避免崩溃

时间:2011-07-22 06:55:48

标签: objective-c ios memory-management uiscrollview

我的应用,使用滚动视图加载NSOperation(最大约100sh)的多个图像。我尝试在我的ipod 2Gen上测试它并且由于设备上的内存不足而崩溃,但在ipod第4代上工作正常。在第2代,它在加载大约15-20张图像时崩溃。我该如何处理这个问题?

1 个答案:

答案 0 :(得分:3)

您可以加载图片懒洋洋地。这意味着,例如,滚动视图中一次只有几个图像,这样您就可以设置下一个和前一个图像的动画;当你向右移动时,例如,你还要再加载一个图像;同时,您卸载不再可直接访问的图像(例如那些保留在左侧的图像)。

您应该将预加载图像的数量设置得足够高,以便用户可以随时滚动而无需等待;这还取决于这些图像有多大以及它们来自何处(即加载它们需要多长时间)......一个好的起点是,IMO,随时可以加载5个图像。

在这里,您会找到nice step by step tutorial

编辑:

由于上面的链接似乎已被破坏,以下是该帖子的最终代码:

-(void)scrollViewDidScroll:(UIScrollView *)myScrollView {

/**
 *  calculate the current page that is shown
 *  you can also use myScrollview.frame.size.height if your image is the exact size of your scrollview
 */
int currentPage = (myScrollView.contentOffset.y / currentImageSize.height);

// display the image and maybe +/-1 for a smoother scrolling
// but be sure to check if the image already exists, you can do this very easily using tags
if ( [myScrollView viewWithTag:(currentPage +1)] ) {
    return;
}
else {
    // view is missing, create it and set its tag to currentPage+1
}

/**
 *  using your paging numbers as tag, you can also clean the UIScrollView
 *  from no longer needed views to get your memory back
 *  remove all image views except -1 and +1 of the currently drawn page
 */
for ( int i = 0; i < currentPages; i++ ) {
    if ( (i < (currentPage-1) || i > (currentPage+1)) && [myScrollView viewWithTag:(i+1)] ) {
        [[myScrollView viewWithTag:(i+1)] removeFromSuperview];
    }
}
}