将图像保存到目录时出现内存泄漏问题

时间:2014-03-19 10:13:11

标签: objective-c ios7

请尝试理解我的问题。 我正在从手机库中选择图像并保存到文档目录中。但是当我选择大量图像时,使用的内存逐渐增加并达到400 mb以上,然后我的应用程序崩溃。如果有人能解决我的问题,我该怎么办?我是Objective C的新成员。任何回复都将不胜感激。 这是我的代码

当Picker完成选择时

- (void)agImagePickerController:(AGImagePickerController *)picker didFinishPickingMediaWithInfo:(NSArray *)info  {
[self ShowLoadingView:@"Files Are Loading...."];
[self performSelectorInBackground:@selector(saveAllSelectedImages:) withObject:info];}

然后我将图像保存到目录

-(void) saveAllSelectedImages:(NSArray*)imagesArray{

for (int i=0; i<imagesArray.count; i++) {

    ALAsset *asset = [imagesArray objectAtIndex:i];
    ALAssetRepresentation *alassetRep = [asset defaultRepresentation];
    NSDate *currentDate = [NSDate date];
    NSString* DucPath = [[AppDelegate GetDocumentDirectoryPath] stringByAppendingPathComponent:@"Media"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:DucPath])
        [[NSFileManager defaultManager] createDirectoryAtPath:DucPath withIntermediateDirectories:NO attributes:nil error:nil];

    if ([[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo])
    {



        long long DataSize = [alassetRep size];
        Byte *buffer = (Byte*)malloc(DataSize);
        NSUInteger buffered = (NSUInteger)[alassetRep getBytes:buffer fromOffset:0.0 length:alassetRep.size error:nil];
        NSData *videoData = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];

        NSString* newVideoName = [NSString stringWithFormat:@"video_%d_%d.mov",(int)currentDate,i];
        NSString* newVideoPath = [DucPath stringByAppendingPathComponent:newVideoName];
        [videoData writeToFile:newVideoPath atomically:YES];

        [pImageMediaArray addObject:newVideoName];
    }
    else
    {
        UIImage *image = [UIImage imageWithCGImage:[alassetRep fullResolutionImage]];

        /************************************Full Resolution Images ******************************************/

        NSData *imageData = UIImageJPEGRepresentation(image, 0.8);
        image = nil;

        NSString *originalPath = [NSString stringWithFormat:@"IMAGE_%d_%d.jpg",(int)currentDate,i];
        NSString* pImagePath = [DucPath stringByAppendingPathComponent:originalPath];

        [imageData writeToFile:pImagePath atomically:YES];

        [pImageMediaArray addObject:originalPath];

    }
    /************************************Low Resolution Images ******************************************/
    UIImage *image = [UIImage imageWithCGImage:[alassetRep fullResolutionImage]];
    UIImage *thumbImage = [self imageWithImage:image scaledToSize:CGSizeMake(50, 50)];

    NSData *thumbImageData = UIImageJPEGRepresentation(thumbImage, 0.8);


    NSString *thumbOriginalPath = [NSString stringWithFormat:@"SMALL_IMAGE_%d_%d.jpg",(int)currentDate,i];
    NSString* thumbImagePath = [DucPath stringByAppendingPathComponent:thumbOriginalPath];
    NSLog(@"Image path At Save Time:%@",thumbImagePath);
    [thumbImageData writeToFile:thumbImagePath atomically:YES];

    [pMediaArray addObject:thumbOriginalPath];
}

[appDelegate setPMediaArray:pImageMediaArray];


[pGridView reloadData];
imagesArray = nil;
[imagesArray release];
[pImageMediaArray release];
[self performSelectorOnMainThread:@selector(closeLoadindView) withObject:nil waitUntilDone:YES];}

3 个答案:

答案 0 :(得分:1)

Byte *buffer = (Byte*)malloc(DataSize);

没有被释放?

答案 1 :(得分:1)

我有完全相同的问题。对我有用的是在保存映像时使用自动释放池块。这样将释放保留计数,并且垃圾回收将适当地释放内存,而不是将那些对象保留在内存中,直到包含循环完成运行为止。

示例:在用于保存图像的方法中,添加如下所示的代码:

@autoreleasepool {
    NSString *filePath = [[NSArray arrayWithObjects:self.imagePath, @"/", GUID, @".png", nil] componentsJoinedByString:@""];
    NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)];
    BOOL res = [imageData writeToFile:filePath atomically:YES];
    imageData = nil;
}

答案 2 :(得分:0)

您需要为在后台执行的任务添加autoreleasepool。在上面的代码中,saveAllSelectedImages的内容应该写在autoreleasepool中,否则内存不会被释放。