在我的应用中,我有一堆不同的图像包可供下载。图像是从我的网站逐个下载的。这些包中包含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;
}
}
我遇到的问题是:
当我使用性能工具查看分配时,我看到应用程序每次下载图像时都保留mallocs(NSConcreteData),并且只有在main方法(调用此下载方法的方法)完成时才释放它们。这对于较小的图像包来说很好,但是在我的总分配达到300 + MB(我的应用程序中的正常分配量大约为3mb)之后,较大的图像包显然会崩溃。
它们没有泄漏,因为一旦下载了图像包并且方法结束,所有malloc都消失了。
我尝试过手动分配和释放NSData *数据,但它没有效果。
答案 0 :(得分:1)
在main方法返回之前,对象所在的自动释放池可能没有被耗尽。您可以尝试添加NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];在下载方法的开头,然后[pool drain];在您从下载方法返回之前。无论你返回什么地方,你都需要确保在返回之前释放游泳池,否则你会泄漏游泳池。
此外,作为标准Objective-C样式的一个点,您的方法应该命名为:
- (BOOL)downloadImageName:(NSString *)imageName imageGroup:(NSString *)imageGroup andRow:(int)row
用小写字母开始“imageGroup:”和“andRow:”参数名称。