我有一个url,它是一个音频文件的链接,将使用AVFoundation.framework播放。但由于某种原因,当应用程序达到设置NSData时,它崩溃了。请帮忙。
NSURL *url = [NSURL URLWithString:songPathForm];
NSData *soundData = [NSData dataWithContentsOfURL:url];
EDIT :::: 这就是我所做的让它停止崩溃,但数据不包含任何内容
NSString *url = [songPathForm stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//NSURL *url = [NSURL URLWithString:songPathForm];
NSURLRequest *songRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
NSURLConnection *songConnection = [[NSURLConnection alloc] initWithRequest:songRequest delegate:self];
if(songConnection)
{
songData = [[NSMutableData data] retain];
}
它出现为<>
答案 0 :(得分:4)
完全没有办法回答这个问题,因为它有措辞,但这里有一些线索:
如果发生崩溃,则会有回溯。发布。
如果发生崩溃,则会出现某种错误。发布。
鉴于该代码,我可以想到两种失败模式:
songPathForm
是nil
或已损坏和/或不是网址。
URL
的数据太大而无法下载并导致应用尝试分配大量内存(有些情况下,分配可能会大到足以让应用崩溃o系统jetsam机制踢。)
没有崩溃消息,它只是冻结并停止响应。网址 这不是零......
那你为什么说你的应用程序崩溃了?!
dataWithContentsOfURL:
正在同步下载URL中的内容。
因此,您在下载过程中阻止了主事件循环,这就是您的应用无法响应的原因。
您需要异步下载数据;即不阻止主事件循环。
然而可能无法完全解决您的问题,因为看起来该URL的内容非常大,因此,如果您尝试下载,可能会耗尽内存在记忆中。
您需要将文件下载到磁盘,或者您只需要立即下载您需要的部分文件,或者您需要对其进行流式处理(如果它确实是URL所暗示的大型音频文件)。
更新后的问题中的代码没有任何意义。您希望songData
如何填充连接中的数据?
当异步做事时,你基本上是在说“去做这些事情,让我时不时地知道它是怎么回事”。在这种情况下,这将是一个通知,表明有更多数据可用,或者连接已完成读取(或错误)。
您无法立即询问数据,因为数据无法立即获得。