從配置文件Instruments
我瞭解到,我將映像保存到磁盤的方式導致內存峯值達到~60MB
。這導致應用程序發出low memory warnings
,這(不一致)導致iPhone4S
運行iOS7
上的崩潰。大多數內存有效的方式來保存照片到iPhone上的磁盤?
我需要最有效的方式將圖像保存到磁盤。
我目前使用此代碼
+ (void)saveImage:(UIImage *)image withName:(NSString *)name {
NSData *data = UIImageJPEGRepresentation(image, 1.0);
DLog(@"*** SIZE *** : Saving file of size %lu", (unsigned long)[data length]);
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:name];
[fileManager createFileAtPath:fullPath contents:data attributes:nil];
}
注:
減少
UIImageJPEGRepresentation
的compressionQuality
參數的值不減少內存秒殺顯著不夠。 例如compressionQuality = 0.8
,通過100
寫入,平均減少內存峯值3MB
。然而,它確實減少了磁盤上的數據的大小(顯然),但這對我沒有幫助。UIImagePNGRepresentation
代替UIImageJPEGRepresentation
對此更糟糕。速度較慢,導致峯值較高。
有沒有可能是this approach與ImageIO
會更有效?如果是這樣,爲什
如果有人有任何建議,它會很好。由於
編輯:
一些在下面的問題上所提出的注意事項。
a)雖然我保存了多個圖像,但我並沒有將它們保存在循環中。我做了一些閱讀和測試,發現一個autorelease池不會幫助我。
b)照片不是每個尺寸60Mb。他們是在iPhone 4S上拍攝的照片。
考慮到這一點,我回去努力克服我認爲的問題;該行NSData *data = UIImageJPEGRepresentation(image, 1.0);
。
導致崩潰的內存尖峯可以在下面的屏幕截圖中看到。它們對應於UIImageJPEGRepresentation
被調用的時間。我也跑了Time Profiler
和System Usage
,指出我在同一個方向。
長話短說,我搬了AVFoundation
,把使用
photoData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
它返回NSData
類型的對象,然後我用這個作爲數據的照片圖像數據使用NSFileManager編寫。
這完全消除了內存中的尖峯。
即
[self saveImageWithData:photoData];
其中
+ (void)saveImageWithData:(NSData *)imageData withName:(NSString *)name {
NSData *data = imageData;
DLog(@"*** SIZE *** : Saving file of size %lu", (unsigned long)[data length]);
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:name];
[fileManager createFileAtPath:fullPath contents:data attributes:nil];
}
PS:我沒有把這個作爲一個問題的答案櫃面讓人覺得它不回答這個標題「內存使用效率最高的方式將照片保存到iPhone上的磁盤?「。但是,如果共識是應該的,我可以更新它。
謝謝。
您正在討論內存中和磁盤上的數據。只有內存導致應用程序被強制終止。你記憶中的東西你不需要。如果圖像很大,那麼你需要以不同的方式使用它... – Wain
我知道這一點。我也在這個問題中說明。即「但是,它確實減少了磁盤上的數據大小(顯然),但這對我沒有幫助。」您的評論「如果圖片很大,那麼您需要以不同的方式使用它」無濟於事。 –
因此,專注於內存的情況,並提供更多的圖像,他們如何處理之前,你來保存,他們是多大的細節... – Wain