1

我有一个有四个标签的应用程序。在每个选项卡中,我使用 nsurlconnection 连接到远程服务器,获取响应并相应地显示。在测试应用程序时,我随机崩溃。如果我再次尝试重现崩溃,我不会崩溃。我不明白崩溃的根本原因是什么。我启用了 NSZombie,符号化的崩溃日志,检查了内存泄漏但没有运气。

我在 Xcode 3 中启动项目,现在我将相同的项目导入 Xcode 4.2,那么 Xcode 的兼容性有什么问题吗?

我在所有选项卡中使用相同的名称作为 nsurlconnection,例如在选项卡 1 中,我将 nsurlconnection 定义为 conn,选项卡 2 将 nsurlconnection 定义为 conn。

这个定义会引起任何问题吗?

请帮我解决这个随机崩溃

       NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: url];

                conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];


                if(label != nil){
                progressView = [[ProgressView showHUDAddedTo:self.tabBarController.view animated:YES] retain];
                    progressView.labelText = label;
                }

                [request release];
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

            NSLog(@"didReceiveresponse");
            if ([response isKindOfClass: [NSHTTPURLResponse class]]) {

                if([(NSHTTPURLResponse *)response statusCode] == 200){

                }
                else{
                    //show Connection Error Alert
                }
            }
            responseData = [[NSMutableData alloc]init];
        }

        - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
            NSLog(@"didReceiveData");
            [responseData appendData:data];
        }

        - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

            [progressView hide:YES];

            NSLog(@"didFail");

           //show failed alert
        }

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

            NSLog(@"didfinish loading");

            if([responseData length] > 0)
                {
    //handles response data

    }
    }
4

3 回答 3

0

我没有看到代码的猜测是,在一个选项卡中你制作一个 NSURLConnection 并在它完成时对结果做一些事情。如果在返回结果之前更改选项卡,则会导致它崩溃。

您需要在 viewDidDisappear 时取消 NSURLConnection,或者确保在完成时运行的任何代码都不包含任何会在选项卡不可见时导致崩溃的内容(例如设置标签文本)。

我处理这个问题的方法是有一个单独的类来执行完成时发送通知的 URL 请求。这样,在您的 viewDidAppear 方法中,您将 viewController 设置为侦听通知,并在 viewDidDisapper 方法中停止侦听通知。因此,如果在 URL 请求完成时您的视图不可见,则会触发通知但没有任何反应。

于 2012-09-05T12:07:00.143 回答
0

你能提供控制台的输出吗?这似乎不是 Xcode 的错误。当您尝试访问已释放的对象时,通常会出现这些类型的错误。

于 2012-09-05T12:07:35.137 回答
0

我相信您已经尝试过具有内存泄漏的仪器。尝试使用带有僵尸工具的乐器,您可以在乐器库中轻松找到它。使用此工具运行您的代码,如果此崩溃是由于任何僵尸对象造成的,那么您将很容易检测到该位置。

它帮助了我几次。

于 2012-09-05T12:23:16.447 回答