Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c UIScrollView延迟加载图像以减少内存使用并避免崩溃_Objective C_Ios_Memory Management_Uiscrollview - Fatal编程技术网

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

Objective c UIScrollView延迟加载图像以减少内存使用并避免崩溃,objective-c,ios,memory-management,uiscrollview,Objective C,Ios,Memory Management,Uiscrollview,我的应用程序,使用scrollview,通过NSO操作加载多个图像(最大约100sh)。我试着在我的iPod2Gen上测试它,由于设备内存不足,它崩溃了,但在iPod4th Gen上运行良好。在2nd Gen上,它在加载大约15-20个图像时崩溃。我该如何处理这个问题 您可以懒洋洋地加载图像。这意味着,例如,在滚动视图中一次只显示两个图像,这样您就可以设置下一个和上一个图像的动画;当您向右移动时,例如,您还加载了一个以上的图像;同时,您卸载无法直接访问的图像(例如,保留在左侧的图像) 您应该使预

我的应用程序,使用scrollview,通过NSO操作加载多个图像(最大约100sh)。我试着在我的iPod2Gen上测试它,由于设备内存不足,它崩溃了,但在iPod4th Gen上运行良好。在2nd Gen上,它在加载大约15-20个图像时崩溃。我该如何处理这个问题

您可以懒洋洋地加载图像。这意味着,例如,在滚动视图中一次只显示两个图像,这样您就可以设置下一个和上一个图像的动画;当您向右移动时,例如,您还加载了一个以上的图像;同时,您卸载无法直接访问的图像(例如,保留在左侧的图像)

您应该使预加载图像的数量足够高,以便用户可以在任何时候滚动而无需等待;这还取决于这些图像的大小以及它们来自何处(即加载它们需要多长时间)。。。在我看来,一个好的起点是在任何时候加载5个图像

在这里你会找到一个新的

编辑:

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

-(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];
    }
}
}
-(无效)scrollViewDidScroll:(UIScrollView*)myScrollView{
/**
*计算显示的当前页面
*如果图像的大小与scrollview的大小相同,也可以使用myScrollview.frame.size.height
*/
int currentPage=(myScrollView.contentOffset.y/currentImageSize.height);
//显示图像,可能是+/-1,以便进行更平滑的滚动
//但是一定要检查图像是否已经存在,你可以很容易地使用标签来实现这一点
如果([myScrollView视图带标记:(当前页面+1)]){
返回;
}
否则{
//缺少视图,请创建它并将其标记设置为currentPage+1
}
/**
*使用分页号作为标记,还可以清理UIScrollView
*从不再需要的视图中恢复您的记忆
*删除除当前绘制页面的-1和+1之外的所有图像视图
*/
对于(int i=0;i(当前页面+1))&&[myScrollView视图带标记:(i+1)]){
[[myScrollView视图带标记:(i+1)]从SuperView中移除];
}
}
}

这正是我的想法,但如何卸载远离当前页面的图像呢?(也就是说,我在第5页,如果已经加载,我愿意卸载0,1,2处的图像)。从superview中删除会卸载我已经加载的图像吗?