iOS内存下载许多大文件时的警告

时间:2013-03-15 09:16:04

标签: ios memory download warnings

我使用以下代码从服务器下载许多文件。 其中一些文件是视频文件(> 60Mo)。

在循环中调用此函数。它适用于小文件......

当我下载太多(取决于)大文件时,我有内存警告,然后是应用程序崩溃。

注意:该项目是ARC

- (bool) copyWebFile:(NSString *)url toFile:(NSString *)toFile ;
{
  NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:url]] ;
  if (data)
  {
    NSError *error ;
    if ([[NSFileManager defaultManager] fileExistsAtPath:toFile])
    {
      NSLog(@"Existant %@", toFile) ;
      [[NSFileManager defaultManager] removeItemAtPath:toFile error:nil] ;
    }
    if ([data writeToFile:toFile options:NSDataWritingAtomic error:&error]==NO)
    {
      NSLog(@"@Error creating file-%@ \n", toFile) ;
      NSLog(@"@Error description-%@ \n", [error localizedDescription]) ;
      NSLog(@"@Error suggestion-%@ \n", [error localizedRecoverySuggestion]) ;
      NSLog(@"Error reason-%@", [error localizedFailureReason]) ;
    }
    else
    {
      return(true) ;
    }
  }
  return(false) ;
}

在我的应用程序委托中,我添加了这段代码:没有区别。

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
  [[NSURLCache sharedURLCache] removeAllCachedResponses] ;
}

2 个答案:

答案 0 :(得分:3)

您应该将文件直接写入磁盘,而不将整个文件保留在内存中。其中一种简单的方法是为NSURLConnection创建一个委托并写入收到的数据。

此问题通过代码示例解答了如何执行此操作:How to download files directly to disk on the iPhone os?

答案 1 :(得分:0)

使用@autoreleasepool并尝试这样..

- (bool) copyWebFile:(NSString *)url toFile:(NSString *)toFile ;
    {
        @autoreleasepool
        {
            NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:url]] ;
            if (data)
            {
                NSError *error ;
                if ([[NSFileManager defaultManager] fileExistsAtPath:toFile])
                {
                    NSLog(@"Existant %@", toFile) ;
                    [[NSFileManager defaultManager] removeItemAtPath:toFile error:nil] ;
                }
                if ([data writeToFile:toFile options:NSDataWritingAtomic error:&error]==NO)
                {
                    NSLog(@"@Error creating file-%@ \n", toFile) ;
                    NSLog(@"@Error description-%@ \n", [error localizedDescription]) ;
                    NSLog(@"@Error suggestion-%@ \n", [error localizedRecoverySuggestion]) ;
                    NSLog(@"Error reason-%@", [error localizedFailureReason]) ;
                }
                else
                {
                    return(true) ;
                }
            }
            return(false) ;
        }
    }