我正在尝试加载大约 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/