我正在创建一个将图像存储在设备中的应用程序(保存为coreData),我遇到了问题。 每次我选择一张图片来添加collectionView时,内存都会增加100Mb左右,并且每次都会增加。 我想我添加了ARC,(编辑 - >重构 - >转换为objective-c ARC ..)并且它似乎没有任何问题添加它,但仍然没有释放内存。 当用户在uiimagepicker中选择图像时,这是我的代码:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *chosenImage = info[UIImagePickerControllerOriginalImage];
NSData *imageData = UIImageJPEGRepresentation(chosenImage ,0.2);
if (imageData != nil)
{
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSString *urlString = [NSString stringWithFormat:@"myurl.."];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
NSString *boundry = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundry];
[request addValue:contentType forHTTPHeaderField:@"Content-Type"];
NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundry] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\".jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:imageData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundry] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];
//NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
//NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
NSLog(@"finish uploading");
NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *newImage = [NSEntityDescription insertNewObjectForEntityForName:@"Images" inManagedObjectContext:context];
[newImage setValue:imageData forKey:@"image"];
NSError *error = nil;
// Save the object to persistent store
if (![context save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Opps" message:@"There was an error saving the photo.. try again!" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
}
[photos addObject:imageData];
[self.collectionView reloadData];
}
[picker dismissViewControllerAnimated:YES completion:NULL];
}
答案 0 :(得分:0)
在集合视图单元格中使用这些图像时,应使用与单元格中图像视图大小相对应的图像尺寸(乘以设备的比例)。因此,如果图像视图为100x100 pt,并且比例为2.0,则可能需要在将图像加载到集合视图单元格时将图像大小调整为200x200。
如果你不这样做,当你拍摄高分辨率图像并在单元格中使用它时,所占用的内存量是底层图像尺寸的倍数,而不是图像视图的大小。细胞。它通常需要每像素四个字节,例如3000x2000像素图像将占用24mb,而如果将其调整为200x200图像,则需要160kb。但请记住,使用图像时的内存量远远大于UIImageJPEGRepresentation
的大小。
This is the image resizing code我使用,但您可以随意调整大小。这是Swift rendition。
虽然图像的大小可能是主要问题,但应该注意的是,您不应该将图像数据保存在数组中。您应该保存一些标识符/路径,以便从缓存和/或永久存储中检索映像。但是,不要试图一次性保存与内存中图像相关的实际数据。
顺便说一句,如果出于性能原因使用NSCache
之类的东西,请确保在内存压力下清空该缓存。
另外,如果您调整图像大小,则可以减少在JPEG压缩中使用如此低质量的需要(这会导致图像质量下降)。与牺牲JPEG压缩的质量相比,图像的尺寸通常会对内存使用产生更大的影响。