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簡単な方法の 1 つは、受信したデータのデリゲートを作成して書き込むことです。

この質問は、コード例でそれを行う方法に答えます: 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 に答える