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