在我的应用中,我有一堆不同的图像包可供下载。这些图像是从我的网站一个接一个地下载的。这些包包含100-1500张图像中的任何位置,每个图像大约100KB-200KB。
[下载图像时,我有一个方法选择要下载的图像,然后有第二种方法,它根据从main方法发送的参数进行实际下载。这是下载方法的代码:
-(BOOL) downloadImageName:(NSString *)imageName ImageGroup:(NSString *)imageGroup AndRow:(int)row {
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *docsPath = [paths objectAtIndex:0];
NSURL *downloadURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.website.com/%@_0001.jpg",imageName]];
NSData *data = [NSData dataWithContentsOfURL:downloadURL];
NSString *savePath = [NSString stringWithFormat:@"%@/%@^%@_%@.jpg",docsPath,currentServerCycle,imageGroup,imageName];
BOOL downloaded = [data writeToFile:savePath atomically:YES];
if (downloaded)
return YES;
}
else {
return NO;
}
}
我遇到的问题是:
[当我使用性能工具来查看分配时运行此程序时,我看到该应用程序每次下载映像时都会保留malloc(NSConcreteData),并且仅在main方法(称为此下载方法的方法)完成时才释放它们。较小的图像包就可以了,但是较大的图像包在我的总分配达到300 + MB(我的应用程序中的正常分配量约为3mb)之后显然崩溃了。
它们不会泄漏,因为一旦下载了映像包并且方法结束,所有malloc都将消失。
我已经尝试过手动分配和释放NSData * data,但是它没有任何作用。
也许在主方法返回之前,不会耗尽对象所在的自动释放池。您可以尝试添加NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];在下载方法的开头,然后是[池排水];从下载方法返回之前。无论返回何处,都需要确保释放池后再返回,否则会泄漏池。
此外,就像标准Objective-C风格一样,您的方法应命名为:
以小写字母开头的“ imageGroup:”和“ andRow:”参数名。