看看这个它谈到了正确调整图像大小等等:
https://stackoverflow.com/questions/1282830/uiimagepickercontroller-uiimage-memory-and-more
这是关于 uiimagepickercontroller、uiimage、内存等常见问题解答的精彩教程。
编辑:
在处理 UIImagePickerController 时,内存警告非常常见。在使用相机时尤其如此。请记住,虽然磁盘上的 JPG 或 PNG 可能只有几 MB,但用于绘制图像的未压缩内存位图占用的空间要大得多。
没有什么是你做错了,但可以做一些改进:
与其将图像字节存储在 Core Data 中,为什么不将图像写入磁盘并将文件的路径存储在数据库中?
如果你使用自动发布,而不是使用这么多自动发布的图像,你能找到一种方法来直接管理它们的生命周期并更快地发布它们吗?
您最好的选择可能是在处理后尽快将图像写入磁盘并释放它们正在使用的内存。然后使用 Core Data 而不是原始数据存储他们的位置。
甚至删除所有加载的图像,存储到磁盘,加载新图像,然后存储到磁盘,然后通过路径加载图像。类似的东西。
你可以像这样修改一些代码:
Getting crash after picking images from UIImagePickerController (Related to memory leak?)
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[self dismissModalViewControllerAnimated:YES];
if (object.imagePath != nil) {
[self deleteImages];
}
dispatch_queue_t image_queue;
image_queue = dispatch_queue_create("com.gordonfontenot.app", NULL);
dispatch_async(image_queue, ^{
NSDate *now = [NSDate date];
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"yyyyMMDDHHmmss"];
NSString *imageName = [NSString stringWithFormat:@"Image-%@-%i", [f stringFromDate:now], arc4random() % 100];
NSString *thumbName = [NSString stringWithFormat:@"%@-thumb", imageName];
[f release];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:imageName];
NSString *thumbPath = [documentsDirectory stringByAppendingPathComponent:thumbName];
NSData *thumbImageData = UIImagePNGRepresentation([UIImageManipulator scaleImage:[info objectForKey:@"UIImagePickerControllerEditedImage"] toSize:CGSizeMake(120, 120)]);
[thumbImageData writeToFile:thumbPath atomically:NO];
dispatch_async(dispatch_get_main_queue(), ^{
object.thumbPath = thumbPath;
[self setupImageButton];
imageButton.enabled = NO;
[self setupChooseImageButton];
});
NSData *fullImageData = UIImagePNGRepresentation([UIImageManipulator scaleImage:[info objectForKey:@"UIImagePickerControllerOriginalImage"] toSize:CGSizeMake(800, 600)]);
[fullImageData writeToFile:fullPath atomically:NO];
dispatch_async(dispatch_get_main_queue(), ^{
imageButton.enabled = YES;
object.imagePath = fullPath;
});
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
UIImageWriteToSavedPhotosAlbum([info objectForKey:@"UIImagePickerControllerOriginalImage"], self, nil, nil);
}
});
dispatch_release(image_queue);
}
希望您有足够的信息可以从这里继续。
PK