1

4 つのタブを持つアプリがあります。各タブで、nsurlconnection を使用してリモート サーバーに接続し、応答をフェッチして、それに応じて表示します。アプリのテスト中にランダムにクラッシュします。もう一度クラッシュを再現しようとしても、クラッシュしません。クラッシュの根本原因がわかりません。NSZombie を有効にし、クラッシュ ログをシンボリック化し、メモリ リークをチェックしましたが、うまくいきませんでした。

Xcode 3 でプロジェクトを開始し、同じプロジェクトを Xcode 4.2 にインポートしましたが、Xcode の互換性に問題はありますか?

また、タブ 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 に答える