2014-01-23 34 views
1

我目前正在iOS7的个人项目中工作,并且我必须在Galarie滚动视图中显示多个图像。为此,我创建了一个UIImage,然后将其插入UIImageView。我将我所有的UIImageView储存在NSMutableArray中。 我在UIScrollView上显示所有图片。来自UIImageView的内存泄漏

通过我可以执行的测试,使用的内存可以超过500 MB。

如何优化内存?相机基础应用程序如何发生在您身上显示超过1000张照片?

预先感谢您。热忱。

+3

迟缓装载并且当未示出全屏在进行图像的缩略图。 – rckoenes

回答

1

UICollectionView更适合您的问题!

UICollectionView就像UITableView,只加载显示在屏幕上的单元格。

UICollectionView是一个滚动视图,但具有内存管理。

+3

展开你的观点!解释为什么它更好。 – BooRanger

+0

嗨,我试过UICollectionView,比我不知道。这是非常强大的,但我还没有记忆问题。这是一个疯狂的情况。我会尝试压缩UIImage。 – user2724028

+0

这不是OPs问题 –

1

您需要根据滚动视图位置设置延迟加载。只加载可见屏幕的三倍(或更少,取决于内存需求)并实现UIScrollViewDelegate函数scrollviewDidScroll:以侦听滚动事件。

在scrollViewDidScroll里面,你要搜索你的图像数组(它应该是一个位置和文件名的数组,以获得最佳的内存缓解)。如果滚动视图靠近图像位置,则加载它并将其添加到屏幕上。如果屏幕上已显示某些内容,但现在已足够远离屏幕并卸载,请将其从滚动视图中移除并释放该对象(或者更好地,将其重新用于下一个图像加载)。

看看PDFKitten。他们延迟加载PDF页面。您的图片可以以完全相同的方式实施。

0

几年前,当我在UIImageView中使用全尺寸图片时,遇到了同样的问题。我的应用程序在实际iPhone 4上的内存不足。由于某种原因,它在iPhone模拟器上运行良好。

您必须使用“UIImage + Resize”缩小原始图像以在UIScrollView中显示预览图像。当用户点击其中一个图像时,您可以向他们展示更大/完整的版本。

Download it from here.

CGSize buttonSize = CGSizeMake(100, 100); 

UIImage * newImage = [[UIImage alloc] initWithContentsOfFile: pathToImage]; 
if(newImage) 
{ 
    // this "resizedimage" image is what you want to pass to setImage 
    UIImage * resizedImage = [newImage resizedImage: buttonSize interpolationQuality: kCGInterpolationLow]; 
} 
0

简单的解决方案是,原始图像保存到目录并将调整后的图像以滚动型。此解决方案将使您能够以最少的内存使用量将更多数量的图像添加到滚动视图。下面是示例代码

- (IBAction为)selectImageBtnClicked:(ID)发送方 {

UIImagePickerController * picker = [[UIImagePickerController alloc] init]; 
picker.delegate = self; 
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
[self presentViewController:picker animated:YES completion:nil]; 
[picker release]; } 

- (无效)imagePickerController:(的UIImagePickerController *)选择器didFinishPickingMediaWithInfo:(的NSDictionary *)信息{

[picker dismissViewControllerAnimated:YES completion:nil]; 
[[picker parentViewController] dismissViewControllerAnimated:YES 

完成:无;

UIImage *pTakenImage = [info objectForKey:UIImagePickerControllerEditedImage]; 
if (!pTakenImage) 
    pTakenImage = [info objectForKey:UIImagePickerControllerOriginalImage]; 

[self performSelectorOnMainThread:@selector(proceedFURTHER:) 

withObject:pTakenImage waitUntilDone:NO]; }(void)progressFURTHER:(UIImage *)pTakenImage UIImage * pResizedImage = [self resizeImageToMaxSize:640.0 anImage:pTakenImage];}}}}}}}}}}}}}

[self saveOriginalImageToDir:pTakenImage]; 

//add pResizedImage to your scrolview here 

[self.navigationController popViewControllerAnimated:YES]; } 

- (的UIImage *)resizeImageToMaxSize:(CGFloat的)最大anImage:(的UIImage *)anImage {

NSData * imgData = UIImageJPEGRepresentation(anImage, 1); 
CGImageSourceRef imageSource = 

CGImageSourceCreateWithData((CFDataRef)imgData,NULL); if(!imageSource) return nil;

CFDictionaryRef options = 

(CFDictionaryRef)[NSDictionary的dictionaryWithObjectsAndKeys:

(ID)kCFBooleanTrue,(ID)kCGImageSourceCreateThumbnailWithTransform,

(ID)kCFBooleanTrue,(ID)kCGImageSourceCreateThumbnailFromImageIfAbsent,

(ID)[ NSNumber numberWithFloat:max], (id)kCGImageSourceThumbnailMaxPixelSize,nil];

CGImageRef imgRef = 

CGImageSourceCreateThumbnailAtIndex(imageSource,0,options);

UIImage* scaled = [UIImage imageWithCGImage:imgRef]; 

CGImageRelease(imgRef); 
CFRelease(imageSource); 

return scaled; 

}

- (的NSString *)getOriginalImageDirectoryPath {

的NSArray *路径= NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask,YES);

NSString *documentsPath = [paths objectAtIndex:0]; 
NSString *filePath = 

[documentsPath stringByAppendingPathComponent:@“scaledimage.png”];

return filePath; } 

- (无效)saveOriginalImageToDir:(的UIImage *)图像{

NSString *filePath = [self getOriginalImageDirectoryPath]; 

if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) 
    [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil]; 

NSData *data = UIImagePNGRepresentation(image); 

[data writeToFile:filePath atomically:YES]; 
data = nil; }