2011-05-20 14 views
0


私はこのようなAsyncSocketを持っています。NSMutableStringデータ追加エラー

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { 
NSString *message = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; 
[data getBytes:&tdata]; 
    if (tdata > 5) { 

    if(bheader){ 
     if(!charS){ 
      if([message isEqualToString:@"S"]){ 
       CMSG = message; 
       charS=YES; 
      } 
     } 
     else{ 
      NSMutableString *tmp = [[NSMutableString alloc] initWithString:@""]; 
      [tmp appendString:CMSG];  <<<<< This is code error at loop 2, 
      [tmp appendString:message];  the first loop success but second is fail 
      CMSG = tmp; 
      [tmp release]; 
     } 
    } 
    else{ 
     if (message){    
      cmessage = [[NSString alloc]initWithFormat:@"%@%@",cmessage,message] ; 
     } 
     else 
      NSLog(@"Error converting received data into UTF-8 String"); 

     cdata++; 
     if(cdata==idata) { 
      msgComplete=YES; 
     } 

    } 

    if (msgComplete) { 
     NSDictionary *userInfo = [NSDictionary dictionaryWithObject:cmessage forKey:kNotificationMessage]; 
     [notificationCenter postNotificationName:kNotification object:self userInfo:userInfo]; 
     [email protected]""; 
     [email protected]""; 
     msgComplete=NO; 
     bheader=YES; 
     cdata=0; 
     charS=NO; 
     [cmessage release]; 

    } 
} 

[sock readDataToLength:1 withTimeout:-1 tag:0]; 

}

このコードは[tmp appendString:CMSG];スレッド1の第2ループで失敗:プログラムは、信号 "SIGABRT" を受信
このエラーを修正する方法は?
ありがとうございます。

+0

「ループ」と言いますが、このコードにループはありません。それはループ内で実行されていますか? –

+0

デバッガでこれを実行している場合は、通常、SIGABRTには例外とスタックトレースが付属しています。 _ *あまりにも*それらを含めるには非常に問題がありますか? – Andrew

+0

これはメソッドにループしています:) – user752846

答えて

0

CMSGはtmpに割り当てられましたが、直後にtmpが解放されます。 CMSGをループ全体に保持する必要があります。

CMSG = tmp; //<< should be CMSG = [tmp retain]; 
[tmp release]; 

もう1つの潜在的な問題があります。あなたは が

[data getBytes:&tdata]; 
    if (tdata > 5) { 
ここ

getBytes:

を非推奨メソッドを使用しているため、潜在的なバッファオーバーランの非推奨とGetBytesメソッドの結果は、 if(tdata > 5)のために使用することは適切ではありませんました。バイトの長さを確認したい場合は、 NSDataオブジェクトから取得します。

+0

うわー、これは仕事のおかげです。ジョー、私はObject-Cの新機能ですが、これを使う必要があるときは本当に[tmp retai]についてはわかりません。私はこの(CMSG = tmp)コードを使用するが、それを使用する他のケースのため:) – user752846

+0

「メモリ管理プログラミングガイド」は、リリースと保持の使用方法を非常に洞察しています。あなたがCMSGにtmpを割り当てたとき、CMSGは単にtmpへの参照であり、次にtmpをリリースしました。その時点でtmpは役に立たず、CMSGは役に立たず、その後2番目のループで使用しようとしました。 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html – Joe

+0

感謝のジョーが、なぜ私はこのコードを使用してエラーがあります: 'NSMutableString * tmp = [[NSMutableString alloc] initWithString :CMSG]; [tmp appendString:message]; CMSG = [tmp保持]; [tmp release]; ' – user752846

0

ここでは究極の問題であるかどうかは間違いです。最終的な条件文では、次のようになります。

[email protected]""; 
... 
[cmessage release]; 

私はあなたがその文字列を解放する必要があるとは思わない。私は実際にstringWithFormat:またはinitWithString:とは対照的に、そのように定義されたNSStringのオブジェクトのインとアウトをすべて知っていませんが、その文字列オブジェクトの所有権はないと思います。あなたはそれを解放する必要はありません。

そのreleaseメッセージを削除し、役立つかどうか確認してください。

+0

こんにちはチャーリーさんが返信してくれてありがとう、cmessageにエラーはありませんが、CMSG、私は[cmessage release]を発言しようとしていますが、 – user752846

+0

Joeが提案したようにCMSGを保持しましたか?ここでループはどこですか? – CharlieMezak

+1

文字列リテラルを解放することは決して解除されないので、悪い習慣であること以外の問題はありません。本当の問題は、ユーザー\ d +がオブジェクトを空文字列に設定して解放しようとしているようです。 ** cmessageまたはCMSGまたはその他の文字列を@ ""に設定してメモリリークの原因となるので解放しないでください。 [cmessage release]、[CMSG release]のみ呼び出します。 – Joe

関連する問題