我试图加载大约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。
答案 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];
}
}
}