私は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)
手がかりはありますか?
チップをありがとう。変数を設定すると、次のメッセージが表示されます。 - [NSConcreteMutableData release]:解放されたインスタンス0x26b4dfe0にメッセージが送信されます(実行ごとに異なるアドレス)。そのアドレスの後ろにどのオブジェクトが隠れているかわかりません – Pete
NSConcreteMutableDataは返されるNSDataの特定のインスタンスです。私はあなたのリクエストが送信されていることが起こっていると思います。あなたは応答を待っています。それからあなたはその応答を使用しようとしており、初期化されていません( 'response == nil'なら表示されません)。 NSURLConnection Delegateを実装し、接続管理メソッドを介して非同期に要求を処理する方法を見ていきます。 – MystikSpiral