2011-07-01 2 views
1

これを使用してNSDataを設定すると、writeDataメソッドがクラッシュします。asyncSocket writeDataが異なるNSDataでクラッシュする

NSString *test = @"The quick brown fox jumped over the lazy dog\r\n"; 
    NSData *data = [test dataUsingEncoding:NSUTF8StringEncoding]; 

    [asyncSocket writeData:data withTimeout:10 tag:4]; 

私はこの1つを使用している場合しかし、それは動作します...しかし、私は私が送信するためにフォーマットされた文字列を入力することができますNSStringのを必要とする...

char bytes[] = "The quick brown fox jumped over the lazy dog\r\n"; 
NSData* data = [[NSData alloc] initWithBytes:bytes length:sizeof(bytes)]; 

[asyncSocket writeData:data withTimeout:10 tag:4]; 

は、だから私は間違って何をしましたか?

+0

理論的には、NSDataの上記の両は、それらの正確な同じビットを持っている...行うとのNSLogのNSDataの両方のケースでは、ログ出力を比較... – amattn

+0

@amattn、いや、彼らが行う必要があります同じビットを持たない - char []はnullで終了するので、文字列は0d0a00で終了するが、最初のバージョンでは0d0aで終了する。 – Roger

+0

もう1つの問題は、2番目のバージョンでメモリリークが発生していることです。 asyncSocketなので、asyncSocketが最初の例のデータを保持していないのだろうか? – amattn

答えて

1

NSStringとNSDateは、allocとinitで設定されていないため、書き込みデータに達したときに消えました。私はallocとinitへのNSDateを変更し、すべて正常に動作します。これらの考えは、これに答えたいくつかの人々から来ました。助けてくれてありがとう!

0

後者はヌルで終了しますが、前者はヌルで終了します。これはおそらく問題です。

+0

はい、問題ですが、%cと0を使用してNSString形式でnullを追加しようとしましたが、動作しませんでした。 nullを追加するにはどうすればよいですか? –

+0

ここを見てくださいhttp://stackoverflow.com/questions/2111766/how-to-use-null-character-with-nsstring – Roger

+0

リンクのおかげで、私は今、最後にヌルを持っています。データは同じログに出力されます。しかし、それはまだクラッシュします。上記の2番目のデータはallocで作成され、1番目のデータはNSStringから作成されます。それはそれと関係がありますか? –

0

私はビットが遅いことを知っていますが、なぜこれがうまくいくのか知っておいた方が良いと思いました。データバッファでwriteDataメソッドを呼び出すと、asyncsocketコードは渡されたデータを使ってNSObject-AsyncWritePacketをサブクラス化して新しいオブジェクトを作成します。それから、retainを使い、あなたが渡しているデータバッファの所有権をとります。なぜそれを解放したくないのですか?

@implementation AsyncWritePacket 
- (id)initWithData:(NSData *)d timeout:(NSTimeInterval)t tag:(long)i 
{ 
    if((self = [super init])) 
    { 
     buffer = [d retain]; 
     timeout = t; 
     tag = i; 
     bytesDone = 0; 
    } 
    return self; 

@end 
関連する問題