Xcode应用程序不释放内存

我正在创build一个应用程序,在设备中存储图像(保存为coreData),我有一个问题。 每次我select一个图片添加collectionView时,内存都在100Mb左右增加,而且每增加一次。 我想我加了ARC,(Edit-> refactor-> convert to objective-c ARC ..),添加它似乎没有任何问题,但内存仍然不释放。 这是我的代码,当用户在uiimagepicker中select图像时:

- (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]; } 

  1. 在收集视图单元格中使用这些图像时,应使用与单元格中图像视图大小相对应的图像尺寸(乘以设备的比例)。 因此,如果图像视图为100×100磅,缩放比例为2.0,则在将图像加载到集合视图单元格中时,可能需要将图像大小调整为200×200。

    如果不这样做,当您拍摄高分辨率图像并将其用于单元格时,所占内存量是基础图像尺寸的倍数,而不是单元格中图像视图的尺寸。 通常每个像素需要四个字节,例如一个3000×2000像素的图像需要24MB,而如果被调整到200×200的图像,则需要160kb。 但请记住,使用图像时的内存量远远大于UIImageJPEGRepresentation的大小。

    这是我使用的图像大小调整代码 ,但随意调整任何你想要的方式。 这是一个Swift的翻译 。

  2. 虽然图像的大小可能是主要问题,但应注意的是,您不应将图像数据保存在数组中。 您应该保存一些标识符/path,您可以使用它们从caching和/或持久存储中检索映像。 但是不要试图一次性保存与图像相关的实际数据。

    顺便说一下,如果你出于性能原因使用类似NSCache东西,确保你在内存压力下清空caching。

  3. 另外,如果您调整图像大小,则会降低在JPEG压缩中使用如此低质量的需求(这可能会导致图像质量损失)。 与牺牲JPEG压缩质量相比,图像的尺寸通常会对内存使用产生更大的影响。