使用NSMutableData但appendData失败

时间:2011-07-03 06:09:55

标签: iphone objective-c nsmutabledata

当我使用100长度初始化NSMutableData时,它附加数据失败。

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长度初始化时,它可以很好地追加

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

我是Objective-C的新手,你可以帮助我吗?

4 个答案:

答案 0 :(得分:3)

initWithLength:initWithCapacity:之间存在差异。 initWithLength:实际上在数据开头给了你很多0的字节,而initWithCapacity:只是一个存储用的提示。如果你尝试用开头的0来创建一个字符串,那么它将是一个空字符串。

答案 1 :(得分:2)

使用initWithCapacity:,如果您已在自己的财产中声明receiveDataretain,则会泄漏内存泄漏。

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

OR

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

答案 2 :(得分:1)

请尝试-initWithCapacity:+dataWithCapacity:-initWithLength:创建一个包含您指定的字节数的数据对象。因此,当您将数据附加到可变数据对象时,您将获得一个包含100个字节零的对象,后跟您附加的任何数据。 NSString可能会查看第一个零字节并返回一个空字符串。

答案 3 :(得分: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;
}

它运作得很好,试一试......