2

我使用以下代码从服务器下载许多文件。其中一些文件是视频文件 (>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] ;
}
4

2 回答 2

3

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

这个问题通过代码示例回答了如何做到这一点:How to download files directly to disk on the iPhone os?

于 2013-03-15T09:49:30.140 回答
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) ;
        }
    }
于 2013-03-15T10:06:29.847 回答