iOS / iPad上有关内存问题的帮助

问题描述 投票:0回答:1

在我的应用中,我有一堆不同的图像包可供下载。这些图像是从我的网站一个接一个地下载的。这些包包含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,但是它没有任何作用。

iphone memory ipad memory-management nsdata
1个回答
1
投票

也许在主方法返回之前,不会耗尽对象所在的自动释放池。您可以尝试添加NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];在下载方法的开头,然后是[池排水];从下载方法返回之前。无论返回何处,都需要确保释放池后再返回,否则会泄漏池。

此外,就像标准Objective-C风格一样,您的方法应命名为:

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

以小写字母开头的“ imageGroup:”和“ andRow:”参数名。

© www.soinside.com 2019 - 2024. All rights reserved.