2010-09-17 72 views
0

在我的应用程序中,我有一堆不同的图像包可供下载。这些图像从我的网站上逐一下载。这些包包含100-1500个图像,每个图像大约100KB-200KB。iOS/iPad上的内存问题帮助

下载图像时,我有一种方法可以选择要下载的图像,然后我有第二种方法根据主方法发送的参数进行实际下载。下面是下载方法的代码:

-(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 )每次下载图像时,只有在主方法(调用此下载方法的那个方法)完成时才释放它们。这对于较小的图像包来说很好,但是在我的总分配达到300 + MB(我的应用程序的正常分配量约为3mb)之后,较大的分配显然会崩溃。

它们没有泄漏,因为一旦图像包下载并且方法结束,所有的malloc都不见了。

我试过手动分配和释放NSData *数据,但它没有效果。

回答

1

也许对象所在的autorelease池在main方法返回之前不会被排空。你可以尝试添加NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];在你的下载方法开始时,然后[pool drain];在从下载方法返回之前。无论您返回哪里,您都需要确保您在返回之前释放泳池,否则您会泄漏泳池。

而且,就像标准的Objective-C风格的一个点,你的方法应该命名为:

- (BOOL)downloadImageName:(的NSString *)imageName imageGroup:(的NSString *)imageGroup andRow:(INT)行

用小写字母开始“imageGroup:”和“andRow:”参数名称。

+0

非常感谢!我从来没有在一个方法上使用过自动释放池,我之前并不打算在单独的线程中使用它。并感谢您指出命名错误。 – Brodie 2010-09-17 23:50:25