2014-01-23 32 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; }