2014-04-25 80 views
0

我有一个scrollView,其中我从网络加载图像。我有时会得到内存警告,我认为这是因为我在图像加载程序中做了一些错误。 我正在尝试解决一些小问题,并且我只是想在这里展示代码,并且也许还有更多的事情可以解决,以摆脱此警告。将图像加载到滚动条时发生内存泄漏

因此,每次滚动(iPad)只有4/5图像是:current page-3->current page+3

这是我如何加载图像(每个图像也有与苹果的类模糊效果): (?每次我应该分配的ImageView我可以在这里提高的东西)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^
        { 
         NSData *imdata2 = [NSData dataWithContentsOfURL:url]; 


         dispatch_async(dispatch_get_main_queue(),^
         { 
          UIImage *theImage=[UIImage imageWithData:imdata2 scale:1]; 
          UIImage *LightImage = [theImage applyLightEffect]; 


          UIImage *scaledImage =[resizer resizeImageToWidth:[Globals sharedGlobals].imagesWidth WithImage:theImage]; 

          CGRect viewSizeBack=CGRectMake(scroller.bounds.size.width*toPage , 0, scroller.bounds.size.width, scroller.bounds.size.height); 

          int x=[Globals sharedGlobals].pageMargins; 
          int y=([UIScreen mainScreen].bounds.size.height-scaledImage.size.height)/2; 


          CGRect viewSizeFront=CGRectMake(x , y, scaledImage.size.width,scaledImage.size.height); 




          UIImageView *backImageView=[[UIImageView alloc] initWithFrame:viewSizeBack]; 
          UIImageView *frontImageView=[[UIImageView alloc] initWithFrame:viewSizeFront]; 



          backImageView.layer.cornerRadius = 0.0; 
          backImageView.layer.masksToBounds = YES; 
          backImageView.image=LightImage; 

          frontImageView.layer.cornerRadius = 0.0; 
          frontImageView.layer.masksToBounds = YES; 
          frontImageView.image=scaledImage; 
          frontImageView.layer.borderWidth=1.0; 
          frontImageView.layer.borderColor=[UIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:1.0].CGColor; 

          [backImageView addSubview:frontImageView]; 

          backImageView.tag=toPage; 
          frontImageView.tag=toPage; 
          [scroller addSubview:backImageView]; 


         }); 
        }); 

回答

0

您应该只有最多加载3个图像 - 前一页(如果存在),当前页面和下一页。

你在上面加载的任何其他图像都是浪费的,因为你看不到它们,它们只是无缘无故地占用了内存。如果图像不是太大,您可以将它们保存在内存中,并在发出警告时清除它们,但对于大图像,这通常会导致您遇到问题。

+0

这是不完全正确,因为当用户滚动速度不够快,他会得到仍没有图像的网页,并看到一个白色的空间 - 这对我的意见是一个糟糕的用户界面..所以当我给它6张图片,我可以滚动非常快,并始终在我的滚动内容。你不觉得吗? – Curnelious

+0

这是一个折衷,如果你有内存可用,那么确定,启用快速滚动,但我们谈论的是内存受限的设备,快速滚动通常是边缘情况,因此只有少数人会“受益”是反生产力的。这也是一个好处吗?你可以在快速滚动的时候有用地看到图像... – Wain

+0

是的..我认为你是对的,我已经尝试过将它设置为3张图像,但我仍然得到这个内存警告 - 它发生在我滚动的那一刻我认为他们必须做的异步加载..有没有办法找到确切的问题? – Curnelious

0

如果你不使用ARC再补充一点:

[backImageView autorelease]; 
[frontImageView autorelease]; 
+0

我正在使用弧线:) – Curnelious

相关问题