2011-01-28 15 views
0

私はObjective Cの初心者です。.NETとJavaの年が私のメモリ管理スキルに錆びているので、ここで何か不足している可能性が非常に高いです。ランダムBAD_ACCESSと「セレクタが認識されていません」

iPadアプリを構築しています。メインビューはSplitViewで、左側にTableViewがあり、詳細ビューには別のTableViewが含まれています。後者にデータをロードすることは、私の問題を解決するためにコメントアウトされています。

アプリはうまくいくようです(.NET WSからデータを取得してテーブルに解析する必要があります)が、ランダムにBAD_ACCESSまたは「セレクタが認識されません」というエラーが発生します。

セレクタは、私がここに来るエラー認識されない:

-(void) connection:(NSURLConnection *) connection 
didReceiveResponse:(NSURLResponse *) response { 
    [webData setLength: 0]; 
} 

私はあなたのほとんどが知っていると確信しているコードのこの作品を、私は、ウェブを送信するために、私はオンラインで見つけるすべてのサンプルからや書籍でそれを得ました要求。それははsetLengthセレクタを認識しないと言う理由

が私を打つ、WEBDATAは

NSMutableData *webData; 

任意のアイデアのように定義されて?

ありがとうございました。

答えて

1

あなたはどちらか

NSMutableData* webData = [[NSMutableData alloc] initWithCapacity:2048]; 

または

NSMutableData* webData = [[NSMutableData data] retain]; 

であなたのWEBDATAオブジェクトを割り当てない場合、WEBDATAオブジェクトは、最も可能性の高いあなたNSURLConnectionメッセージからコンテキストスイッチの1つの間に自動解放されますconnection:didReceiveResponse:メッセージにそれを割り当てました(おそらくconnection:didReceiveData:)。

allocまたは明示的にretainでないオブジェクトは、スコープが変更されている間は、クラスのメンバ変数であっても割り当て解除される可能性があります。

+0

です。割り当て解除のランダム性は、ソースの問題として実際に自動リースに適合します。これは私がwebDataをインスタンス化するコードです:conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];だから私はそれを保持する、またはそれはまだ問題ですか? if(conn){ webData = [[NSMutableData data] retain]; } –

+0

あなたはwebDataを保持していますので、autoreleaseはあなたの問題ではありません。更新された情報に基づいて問題が何であるかは明らかではありません。あなたのwebDataオブジェクトを割り当てるために 'if(conn) 'を使う代わりに、あなたの接続に行を移してください:didReceiveData:NSURLConnectionはメッセージを委譲し、' if(webData == nil)webData = [[NSMutableData Webデータをリリースしたところで、[webData release]、webData = nil;に変更してください。 –

+0

リリースされたオブジェクトは、解放した直後に常にnilに設定することを強くお勧めします。これは '[webData release]; [webData getLength]; 'は常にクラッシュしますが、' [webData release]、webData = nil; [webData getLength]; 'はできません。 –

0

webDataが割り当て解除され、他のオブジェクトで置き換えられているようです。 alloc/initやmutableCopyを使用しない場合は、保持するようにしてください。

+0

私は以下を使用します:webData = [[NSMutableData data] retain]; –

1

NSMutableDataを正しく作成していない可能性があります。私はあなたがこれはあなたの自動解放オブジェクトを与えるために起こっている、まだあなたはIVARにそれを保存している

webData = [NSMutableData data]; 

ようなコードを持って期待しています。オブジェクトをivarに格納するときは、オブジェクトの所有権を取得する必要があります。

webData = [[NSMutableData alloc] init]; 

詳細については、Memory Management Programming Guideを読む:あなたのケースでは、最も簡単な方法は、便利なメソッドをスキップしてのalloc/initで行くことだけです。

+0

ありがとうございます、あなたのリンクを読むでしょう。それまでの間、私はこれを使用しています:webData = [[NSMutableData data] retain]; –

1

非常に普通(初心者だけではない)のエラーで、接続していない場合はdeallocまたはviewWillDisappearにキャンセルされます。コントローラを離れるときは、コントローラによって作成されたすべての接続、タイマーなどをキャンセルして、割り当てられていないコントローラオブジェクトのデリゲートメソッドまたはセレクタを呼び出さないようにする必要があります。

+0

私はコントローラを「離れる」わけではありません。完了すると接続が解放されます。 - (void)connectionDidFinishLoading:(NSURLConnection *)接続{ NSLog(@ "DONE。受信バイト:%d"、[webData長さ]); NSString * theXML = [[NSString alloc] initWithBytes:[webData mutableBytes] 長さ:[webData length] エンコード:NSUTF8StringEncoding]; // --- XMLを表示--- NSLog(theXML); [theXML release]; [接続リリース]; [webData release]; } –

+0

その場合、関連するすべてのコードとスタックトレースをクラッシュ時に提供してください – Yuras

+0

いずれにしても、 'dealloc'と' viewWillDisappear'で 'cancel'メソッドを呼び出すようにしてください。 – Yuras

関連する問題