加载图像会导致内存出现峰值

时间:2014-05-05 16:13:49

标签: ios objective-c cocoa memory-management

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

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

这样可以正常工作,但我注意到在负载期间内存正在激增,在负载结束时达到16MB,如仪器所示。加载完成后,内存会降低并保持不变。将来,我需要加载的图像数量可能会增加。我应该担心吗?我尝试了几种不同的方法来读取图像和几种编写文件的方法。我也尝试将代码包装在@autoreleasepool中,但它没有帮助。我使用ARC,app适用于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这两行放入他们自己的方法中并将其包装在autoreleasepool中,但没有帮助。

在乐器中,我正在观看&#34;直播字节&#34;在负载结束时增加到超过16MB,然后在负载结束后立即降至2.5MB。

1 个答案:

答案 0 :(得分:0)

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

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