帮助解决iOS / iPad上的内存问题

时间:2010-09-17 23:03:04

标签: iphone memory ipad memory-management nsdata

在我的应用中,我有一堆不同的图像包可供下载。图像是从我的网站逐个下载的。这些包中包含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 *数据,但它没有效果。

1 个答案:

答案 0 :(得分:1)

在main方法返回之前,对象所在的自动释放池可能没有被耗尽。您可以尝试添加NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];在下载方法的开头,然后[pool drain];在您从下载方法返回之前。无论你返回什么地方,你都需要确保在返回之前释放游泳池,否则你会泄漏游泳池。

此外,作为标准Objective-C样式的一个点,您的方法应该命名为:

- (BOOL)downloadImageName:(NSString *)imageName imageGroup:(NSString *)imageGroup andRow:(int)row

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