为什么NSData会崩溃我的应用程序?

时间:2011-12-20 17:24:51

标签: objective-c avfoundation nsdata nsurl

我有一个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];
                }

它出现为<>

1 个答案:

答案 0 :(得分:4)

完全没有办法回答这个问题,因为它有措辞,但这里有一些线索:

  • 如果发生崩溃,则会有回溯。发布。

  • 如果发生崩溃,则会出现某种错误。发布。

鉴于该代码,我可以想到两种失败模式:

  • songPathFormnil或已损坏和/或不是网址。

  • URL的数据太大而无法下载并导致应用尝试分配大量内存(有些情况下,分配可能会大到足以让应用崩溃o系统jetsam机制踢。)

  

没有崩溃消息,它只是冻结并停止响应。网址   这不是零......

那你为什么说你的应用程序崩溃了?!

dataWithContentsOfURL:正在同步下载URL中的内容。

因此,您在下载过程中阻止了主事件循环,这就是您的应用无法响应的原因。

您需要异步下载数据;即不阻止主事件循环。

然而可能无法完全解决您的问题,因为看起来该URL的内容非常大,因此,如果您尝试下载,可能会耗尽内存在记忆中。

您需要将文件下载到磁盘,或者您只需要立即下载您需要的部分文件,或者您需要对其进行流式处理(如果它确实是URL所暗示的大型音频文件)。


更新后的问题中的代码没有任何意义。您希望songData如何填充连接中的数据?

当异步做事时,你基本上是在说“去做这些事情,让我时不时地知道它是怎么回事”。在这种情况下,这将是一个通知,表明有更多数据可用,或者连接已完成读取(或错误)。

您无法立即询问数据,因为数据无法立即获得。

您需要read through this guide