菜鸟教程小白 发表于 2022-12-12 10:24:19

ios - NSURLConnection 两次后崩溃


                                            <p><p>我使用下面的地址来下载一个 mp3 文件。我有一个 <code>uitoolbarbutton</code>,当点击这个按钮时,我调用 <code>downloadandCreatePath</code> 然后它创建一个 View ,其中包含 my`downloadProgressV' 和一个用于取消下载的 UIButton。</p>

<p>我点击下载 View 出现并下载。下载成功,如果我取消,它也可以正常工作。</p>

<p>问题是,如果我做第二次,然后第三次。该应用程序第三次崩溃,并在我的 <code>appdelegate</code> 上显示 <code>EXC_BAD_ACCESS</code> 消息。</p>

<pre><code>NSURLResponse *urlResponse;
NSMutableData *downloadedMutableData;
NSURLConnection *connectionManager;

- (NSString *) downloadandCreatePath: (int) doaId
{
    @try {

      self.downloadProgressV.progress=0.0;

      self.downloadView.hidden=NO;


      NSString *stringURL = @&#34;http://www.ergmusic.com/mp3-samples/488000/488799.mp3&#34;;

      NSURLRequest *urlRequest =
                                                    cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                                timeoutInterval:60.0];

      connectionManager = [ initWithRequest:urlRequest delegate:self];

      if (!connectionManager) {
            // Release the receivedData object.
            downloadedMutableData = nil;
            // Inform the user that the connection failed.
      }

    }
    @catch (NSException *exception) {
      NSLog(@&#34;buuuuuuug&#34;);
      return @&#34;&#34;;
    }
}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    ;
    urlResponse = response;
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    ;
    self.downloadProgressV.progress = ((100.0/urlResponse.expectedContentLength)*downloadedMutableData.length)/100;
}

- (void)connection:(NSURLConnection *)connection
didFailWithError:(NSError *)error
{
    connectionManager = nil;
    downloadedMutableData = nil;
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {

    self.downloadProgressV.progress=0.0;
    self.downloadView.hidden = YES;
    connectionManager = nil;
    downloadedMutableData = nil;

}

- (IBAction)cancelDownloadTouchUpInside:(id)sender {
    self.downloadView.hidden=YES;
    ;
    connectionManager = nil;
    downloadedMutableData = nil;
}
</code></pre>

<p>有人知道我的问题出在哪里吗?</p>

<p><strong>更新</strong></p>

<p>我尝试使用以下指令使用 <code>nszombies</code> 调试应用程序:</p>

<p> <a href="http://michalstawarz.pl/2014/02/22/debug-exc_bad_access-nszombie-xcode-5/" rel="noreferrer noopener nofollow">http://michalstawarz.pl/2014/02/22/debug-exc_bad_access-nszombie-xcode-5/</a> </p>

<p>但是这次没有出现错误。</p>

<p><strong>更新</strong></p>

<p>我在 <code>viewdidload</code> 方法中实例化 <code>NSMutableData</code>。</p>

<p>我也尝试在 <code>downloadandCreatePath</code> 的第一行实例化它,但我仍然看到错误。</p>

<p><strong>更新</strong>
错误发生在 <strong>2 次运行</strong> 之后,当我想尝试初始化 <code>connectionManager</code> 时。我想知道为什么在两次运行和第三次尝试后会出现问题。为什么它在第一次运行和第二次尝试后没有直播?!!</p>

<p><strong>更新</strong></p>

<p>我认为下面的堆栈跟踪更好:</p>

<pre><code>    &lt;_NSCallStackArray 0x94ee270&gt;(
0   ???                                 0x097c85cf 0x0 + 159155663,
1   MafatihTebyan                     0x00010cb4 - + 404,
2   MafatihTebyan                     0x000114be - + 94,
3   libobjc.A.dylib                     0x0181f874 - + 77,
4   UIKit                               0x0057d0c2 - + 108,
5   UIKit                               0x00851c9b - + 139,
6   libobjc.A.dylib                     0x0181f874 - + 77,
7   UIKit                               0x0057d0c2 - + 108,
8   UIKit                               0x0057d04e - + 61,
9   UIKit                               0x006750c1 - + 66,
10UIKit                               0x00675484 - + 577,
11UIKit                               0x00674733 - + 641,
12UIKit                               0x005ba51d - + 852,
13UIKit                               0x005bb184 - + 1232,
14UIKit                               0x0058ee86 - + 242,
15UIKit                               0x0057918f _UIApplicationHandleEventQueue + 11421,
16CoreFoundation                      0x01a1383f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15,
17CoreFoundation                      0x01a131cb __CFRunLoopDoSources0 + 235,
18CoreFoundation                      0x01a3029e __CFRunLoopRun + 910,
19CoreFoundation                      0x01a2fac3 CFRunLoopRunSpecific + 467,
20CoreFoundation                      0x01a2f8db CFRunLoopRunInMode + 123,
21GraphicsServices                  0x0303b9e2 GSEventRunModal + 192,
22GraphicsServices                  0x0303b809 GSEventRun + 104,
23UIKit                               0x0057bd3b UIApplicationMain + 1225,
24MafatihTebyan                     0x00008a2d main + 141,
25libdyld.dylib                     0x03c1d725 start + 0,
26???                                 0x00000001 0x0 + 1
)
</code></pre>

<p><strong>重要更新</strong></p>

<p>我注意到代码在第一次调用时也无法在 iOS 6 上运行。在 iOS 6 中它一直在崩溃。</p>

<p><strong>更新</strong></p>

<p>我为 <code>NSURLConnection</code> 看到的所有示例都使用 <code>viewdidload</code> 来创建请求文件。我在一个方法中使用它并一次又一次地调用这个方法。因为每次通话时网址都会发生变化。请问这个有什么问题吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>如果您在第一次下载完成之前启动第二次下载,如果您重新实例化 <code>NSMutableData</code>(您没有向我们展示),旧的 <code>NSMutableData</code> 将被释放,导致僵尸相关的错误。您要么需要维护一个 <code>NSMutableData</code> 对象数组,要么为每次下载实例化一个新的委托(delegate)对象。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - NSURLConnection 两次后崩溃,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/24229876/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/24229876/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - NSURLConnection 两次后崩溃