ios - 加载图像会导致内存激增

标签 ios objective-c cocoa memory-management

我正在尝试加载大约 70 张图像。我在后台线程中执行此操作,读取它们并将它们写入本地沙箱。我使用以下两行来读入文件,然后写入文件。

NSData *imagedata = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imageurl]];
[imagedata writeToFile:path atomically:YES];

这工作正常,但我注意到加载期间内存激增,在加载结束时达到 16MB,如仪器中所示。加载完成后,内存就会下降并保持下降状态。将来,我需要加载的图像数量可能会增加。我应该担心吗?我尝试了几种不同的方法来读取图像和几种写入文件的方法。我还尝试将代码包装在 @autoreleasepool 中,但没有帮助。我正在使用 ARC,该应用程序适用于 iOS 6 和 7。

图像大多为50-100K,最大为150K。

如有任何建议,我们将不胜感激。

这里是更多代码:

- (void)getAllNewImagesAtLoad:(NSMutableArray *)arr {
    @autoreleasepool {
        // NSData *imagedata;  tried defining variable here initially but didn't help
        for (int i=0;i<[arr count];i++) {

            int picID = [[arr valueForKey:@"PictureID"][i] intValue];
            NSString* path = [helper tempPathForImage:picID];

            if ([[arr valueForKey:@"DelFlag"][i] isEqualToString:@"delete"]) {
                if ([[NSFileManager defaultManager] fileExistsAtPath:path] == YES) {
                    [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
               }
            } else if ([[NSFileManager defaultManager] fileExistsAtPath:path] == YES) {
                // do nothing
            } else {
                NSData *imagedata = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imageurl]];
                [imagedata writeToFile:path atomically:YES];
                imagedata = nil;
            }
            NSNumber *val = [NSNumber numberWithInt:(int)(((i+1)*100)/[arr count])];
            [self performSelectorOnMainThread:@selector(updateFunction:) withObject:val waitUntilDone:NO];
        }
    }
}

我确实尝试过 imagedata=nil 的想法,但这没有帮助。我还尝试将 initWithContentsOfURL 和 writeToFile 两行拉出到它们自己的方法中,并将其包装在自动释放池中,但没有帮助。

在仪器中,我看到“实时字节”在加载结束时增加到 16MB 以上,然后在加载完成后立即下降到 2.5MB。

最佳答案

我不确定它是否有帮助,但无论如何你应该将 @autoreleasepool 移到“for”循环内,因为现在它没有多大意义:

- (void)getAllNewImagesAtLoad:(NSMutableArray *)arr {

    // NSData *imagedata;  tried defining variable here initially but didn't help
    for (int i=0;i<[arr count];i++) {
        @autoreleasepool {

        int picID = [[arr valueForKey:@"PictureID"][i] intValue];
        NSString* path = [helper tempPathForImage:picID];

        if ([[arr valueForKey:@"DelFlag"][i] isEqualToString:@"delete"]) {
            if ([[NSFileManager defaultManager] fileExistsAtPath:path] == YES) {
                [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
           }
        } else if ([[NSFileManager defaultManager] fileExistsAtPath:path] == YES) {
            // do nothing
        } else {
            NSData *imagedata = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imageurl]];
            [imagedata writeToFile:path atomically:YES];
            imagedata = nil;
        }
        NSNumber *val = [NSNumber numberWithInt:(int)(((i+1)*100)/[arr count])];
        [self performSelectorOnMainThread:@selector(updateFunction:) withObject:val waitUntilDone:NO];
    }
    }
}

关于ios - 加载图像会导致内存激增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23477055/

相关文章:

ios - 主视图下的半隐藏 View 显示在 alpha segue 中

swift - Cocoa/Swift 3.0 替换 NSNumberFormatter.isPartialStringValid

ios - 圆形 BezierPath 相对于给定的进度值填充太多 - iOS Swift

ios - Mobile Safari - 等到 <video> 完全下载后再播放

ios - 如何在 HighCharts 中将动态文本内容设置为 yAxis stackLabels?

mysql - 关于重复键更新 sqlite FMDB

ios - 为什么 Realm addOrUpdateObject 会导致属性设置为 nil?

iphone - 我可以拥有带有彩色图像的 UIBarButtonItem 吗?

iphone - 度数的主要风向?

iphone - 在特定时间 x 天后创建 NSDate