Xcode App不会释放内存

时间:2015-03-27 22:25:26

标签: ios objective-c core-data memory-management automatic-ref-counting

我正在创建一个将图像存储在设备中的应用程序(保存为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];

}

1 个答案:

答案 0 :(得分:0)

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

    如果你不这样做,当你拍摄高分辨率图像并在单元格中使用它时,所占用的内存量是底层图像尺寸的倍数,而不是图像视图的大小。细胞。它通常需要每像素四个字节,例如3000x2000像素图像将占用24mb,而如果将其调整为200x200图像,则需要160kb。但请记住,使用图像时的内存量远远大于UIImageJPEGRepresentation的大小。

    This is the image resizing code我使用,但您可以随意调整大小。这是Swift rendition

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

    顺便说一句,如果出于性能原因使用NSCache之类的东西,请确保在内存压力下清空该缓存。

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