【问题标题】:Help with memory problem on iOS/iPad帮助解决 iOS/iPad 上的内存问题
【发布时间】:2011-04-13 23:16:42
【问题描述】:

在我的应用程序中,我有许多不同的图像包可供下载。图片是从我的网站上一一下载的。这些包包含 100-1500 张图片,每张图片大小约为 100KB-200KB。

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

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

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

我已经尝试手动分配和释放 NSData *data 但它没有效果。

【问题讨论】:

    标签: iphone memory ipad memory-management nsdata


    【解决方案1】:

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

    另外,作为标准 Objective-C 风格的一点,你的方法应该命名为:

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

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

    【讨论】:

    • 明白了,谢谢!我从来没有在我之前不打算在单独的线程中使用的方法上使用自动释放池。并感谢您指出命名错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    相关资源
    最近更新 更多