2011-07-03 19 views
1

100の長さのNSMutableDataを初期化すると、データが追加されませんでした。NSMutableDataを使用しましたが、appendDataが失敗しました

self.receiveData = [[NSMutableData alloc] initWithLength:100]; 
if (nil == self.receiveData) { 
    MYLOG; 
    return NO; 
} 
- (void)connection:(NSURLConnection *)aConn didReceiveData:(NSData *)data { 
    [self.receiveData appendData:data]; 
    NSString *string = [[NSString alloc] initWithData:self.receiveData encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@",string);//there can't log any string 
    MYLOG; 
    [string release]; 
} 

しかし、私は長さ0でinitをするとき、それはあなたがそれで私を助けることができる私は、Objective-Cのへの新たなんだも

self.receiveData = [[NSMutableData alloc] initWithLength:0]; 
if (nil == self.receiveData) { 
    MYLOG; 
    return NO; 
} 

を追加することができますか?

答えて

3

initWithLength:initWithCapacity:の間に違いがあります。 initWithLength:は実際にはデータの先頭に0バイトの多くのバイトを与えますが、initWithCapacity:はストレージのヒントに過ぎません。最初に0でデータから文字列を作成しようとすると、空の文字列になります。

+0

ああ、私が見る、あなたにjtbandesに感謝:) – DJean

+0

@Gin:あなたを'大歓迎!これがあなたの質問に答えた場合は、左側のチェックマークをクリックして回答としてマークしてください。ありがとう:) – jtbandes

2

initWithCapacity:を使用してください。receiveDataretainと宣言している場合は、メモリリークが発生しています。

self.receiveData = [[[NSMutableData alloc] initWithCapacity:0] autorelease]; 

OR

NSMutableData * myData = [[NSMutableData alloc] initWithCapacity:0]; 
    self.receiveData = myData ; 
    [myData release]; 
    myData = nil ; 
+0

ありがとうJhaliya、私はそれをアロケートとして宣言しました – DJean

+0

@Gin:あなたは 'retain'としてデータインスタンスを保持し、私の答えで提案されたソリューションを使用することができました。また、' dealloc'関数でデータインスタンスを解放することを忘れないでくださいifあなたはそれを「留保」とします。 – Jhaliya

+0

オクラホマ、あなたの提案に従うつもりですが、なぜ保持が割り当てよりも良いのかを知りたい、ありがとう、Jhaliya。 – DJean

1

代わり-initWithCapacity:または+dataWithCapacity:を試してみてください。 -initWithLength:は、指定したバイト数を含むデータオブジェクトを作成します。したがって、変更可能なデータオブジェクトにデータを追加すると、100バイトのゼロを含むオブジェクトが取得され、追加されたデータが続きます。 NSStringはその最初のゼロバイトを見て、空の文字列を返します。

0

私はちょうどそれをこのようでした:

self.globalData = [[NSMutableData alloc] init]; 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [self.globalData appendData:data]; 
    float progress = (float)[self.globalData length]/self.downloadSize; 
    self.threadProgressView.progress = progress; 
} 

をそして、それはかなりうまく動作しますが、それを試してみる...

関連する問題