2011-01-29 10 views
1

私はREST HTTPサービスからxmlとして食料品買い物リストを受け取るiPhoneアプリケーションを開発中です。しかし、私がアプリケーションを実行すると、シミュレータのSIGABRTで終了します。私のアプリケーションが "SIGABRT"で終了するのはなぜですか?

私は[NSAutoreleasePool release]の中にあることをスタックトレースから見ることができるので、メモリ管理の問題だと思います。自動解放プールの問題は、もちろん、実際の問題を追跡することは非常に困難なことがあります。

しかし、NSURLConnection sendSynchronousRequestの呼び出しによって何らかの原因が発生していることがわかりました。なぜなら、その呼び出しの直前にreturn文を置くとエラーが発生するからです(データがない場合を除きます)。 sendSynchronousRequestの直後にreturn文を置くと、SIGABRTが返されます。ここで

は機能

- (NSArray*)getShoppingListItems { 
    NSString *escapedToken = [self.user.token URLEncodedString_ch]; 
    NSString *strUrl = [[NSString alloc] 
         initWithFormat:@"http://www.denglademad.dk/shoppinglist/foruser/%@?token=%@", 
         self.user.userID, escapedToken]; 
    NSURL *url = [[NSURL alloc] initWithString:strUrl] ; 
    NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url]; 
    NSURLResponse *resp = nil; 
    NSError *err = nil; 
    // Returning [NSMutableArray array] does not cause SIGABRT 
    NSData *response = [[NSURLConnection 
         sendSynchronousRequest:urlRequest 
         returningResponse: &resp 
         error: &err] retain]; 
    // Returning here does cause a SIGABRT 
    return [NSMutableArray array]; 
    NSString *xml = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 
    ShoppingListXmlParser *parser = [[ShoppingListXmlParser alloc] init]; 
    return [parser parseShoppingListXmlData:response]; 
} 

私がリリースされなければならないものがたくさんがあります知っているが、これをseingする自動解放問題であり、私は必死に一時的にすべてのリリース/ autoreleaseのコールを削除しました。

ここに、デバッガからの出力があります。

... 
Canceling call as the malloc lock is held so it isn't safe to call the runtime. 
Issue the command: 
    set objc-non-blocking-mode off 
to override this check if you are sure your call doesn't use the malloc libraries or the ObjC runtime. 
(gdb) continue 
DenGladeMad(619,0xa0c51540) malloc: *** error for object 0x4d3cd40: double free 
*** set a breakpoint in malloc_error_break to debug 
Program received signal: “SIGABRT”. 
(gdb) 

手がかりはありますか?

答えて

2

これは一般に、未割り当てオブジェクトの解放に関連するエラーです。ターゲットの実行ファイルにNSZombieEnabled = YESを設定してみてください。 Xcodeで実行可能ファイルをダブルクリックし、引数タブを選択し、プロパティウィンドウの下半分の環境変数セクションでこれを設定します。これは、次回シミュレータでヒットしたときにogsの詳細を表示します。

アプリを作成して送信する前に、この変数を無効にしてください。それがオンになっていると、多くのリソースが消費されるため、アプリのパフォーマンスが低下します。

Good Luck!

+0

チップをありがとう。変数を設定すると、次のメッセージが表示されます。 - [NSConcreteMutableData release]:解放されたインスタンス0x26b4dfe0にメッセージが送信されます(実行ごとに異なるアドレス)。そのアドレスの後ろにどのオブジェクトが隠れているかわかりません – Pete

+0

NSConcreteMutableDataは返されるNSDataの特定のインスタンスです。私はあなたのリクエストが送信されていることが起こっていると思います。あなたは応答を待っています。それからあなたはその応答を使用しようとしており、初期化されていません( 'response == nil'なら表示されません)。 NSURLConnection Delegateを実装し、接続管理メソッドを介して非同期に要求を処理する方法を見ていきます。 – MystikSpiral