如何在ARC中发布NSMutableArray保存的数据

时间:2015-07-10 20:41:32

标签: ios objective-c nsmutablearray automatic-ref-counting

我有一个使用ELCImagePickerController的应用。它让我的用户最多可以选择6张图片。我已保存这些图像并使用它们在整个应用程序中的其他视图控制器中完成视图。但是,我需要能够在用户返回应用程序的主菜单后释放或以某种方式摆脱保存的数据,以便他们可以挑选6张新照片。我刚刚开始学习NSMutableArrays和NSArrays。

在用户返回菜单之前,我想清除按钮操作的数据。我正在使用ARC,而且在使用ARC时我没有找到如何发布数据的运气。任何帮助,将不胜感激。

viewcontroller.m

Fragment B

prank6ViewController.m

- (void)elcImagePickerController:(ELCImagePickerController *)picker didFinishPickingMediaWithInfo:(NSArray *)info
{
    [self dismissViewControllerAnimated:YES completion:nil];

    for (UIView *v in [_scrollView subviews]) {
        [v removeFromSuperview];
    }
    NSLog(@"info :%@", info);
    CGRect workingFrame = _scrollView.frame;
    workingFrame.origin.x = 0;

    NSMutableArray *images = [NSMutableArray arrayWithCapacity:[info count]];

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

        NSDictionary *dict = [info objectAtIndex:i];
        if ([dict objectForKey:UIImagePickerControllerMediaType] == ALAssetTypePhoto){
            if ([dict objectForKey:UIImagePickerControllerOriginalImage]){
                UIImage* image=[dict objectForKey:UIImagePickerControllerOriginalImage];
                [images addObject:image];

                UIImageView *imageview =[[UIImageView alloc]init];
                imageview.image=[images objectAtIndex:i];
                [_scrollView addSubview:imageview];
                NSString *imagePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
                NSString *stringWithIndex = [NSString stringWithFormat:@"MainImage%d.jpg", i];
                NSString *imageName = [imagePath stringByAppendingPathComponent:stringWithIndex];
                NSData *imageData = UIImageJPEGRepresentation(imageview.image, 1.0);
                BOOL result = [imageData writeToFile:imageName atomically:YES];
                NSLog(@"Saved to %@? %@", imageName, (result? @"YES": @"NO"));
                [imageview setContentMode:UIViewContentModeScaleAspectFit];
                imageview.frame = workingFrame;

                [_scrollView addSubview:imageview];

                workingFrame.origin.x = workingFrame.origin.x + workingFrame.size.width;
            } else {
                NSLog(@"UIImagePickerControllerReferenceURL = %@", dict);
            }
        } else if ([dict objectForKey:UIImagePickerControllerMediaType] == ALAssetTypeVideo){
            if ([dict objectForKey:UIImagePickerControllerOriginalImage]){
                UIImage* image=[dict objectForKey:UIImagePickerControllerOriginalImage];

                [images addObject:image];

                UIImageView *imageview = [[UIImageView alloc] initWithImage:image];
                [imageview setContentMode:UIViewContentModeScaleAspectFit];
                imageview.frame = workingFrame;

                [_scrollView addSubview:imageview];

                workingFrame.origin.x = workingFrame.origin.x + workingFrame.size.width;
            } else {
                NSLog(@"UIImagePickerControllerReferenceURL = %@", dict);
            }
        } else {
            NSLog(@"Uknown asset type");
        }
        self.chosenImages = images;
    }
    [_scrollView setPagingEnabled:YES];
    [_scrollView setContentSize:CGSizeMake(workingFrame.origin.x, workingFrame.size.height)];
}

3 个答案:

答案 0 :(得分:1)

至少,UIImageJPEGRepresentation返回我认为的自动释放的NSData对象,因此每个NSData对象仍然在自动释放池上,直到RunLoop结束或当前Autorelease Pool范围结束的任何地方。请使用@autoreleasepool作为以下内容。

@autoreleasepool {
    NSData *imageData = UIImageJPEGRepresentation(imageview.image, 1.0);
    BOOL result = [imageData writeToFile:imageName atomically:YES];
    NSLog(@"Saved to %@? %@", imageName, (result? @"YES": @"NO"));
}

答案 1 :(得分:1)

我的问题与ELCImagePickerController直接相关。它只是在一个时刻拉动太多数据。这有时会(5/10)使应用程序崩溃。

一次拉出6张照片,单个视图的内存使用量为242MB。我认为内存管理比ELCImagePickerController提供的漂亮布局更重要。所以我放弃了。

我很高兴我做到了。我正在做同样的事情,但让我的用户一次选择一个图像。这使视图的内存使用量低于12MB。总而言之,我并没有使用它。谢谢您的帮助。

答案 2 :(得分:0)

ARC只会保留对它们有强引用的对象。如果您不再希望保留某些内容,则需要删除对它的引用,通常只需将nil分配给您持有引用的变量即可。

不详细检查您的代码语句:

self.chosenImages = nil;

可能就是你要找的东西 - 这将删除对可变数组的引用和提供的 你没有对数组的其他引用ARC将清除它。

此外,您对elcImagePickerController:的下一次调用会创建一个新数组并分配给chosenImages,ARC将清除上面chosenImages引用的上一个数组。

HTH