1

当我用 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

4 回答 4

3

initWithLength:和之间有区别initWithCapacity:initWithLength:实际上在数据的开头为您提供了那么多字节的 0,而initWithCapacity:这只是出于存储目的的提示。如果您尝试用开头为 0 的数据创建一个字符串,它将是一个空字符串。

于 2011-07-03T06:13:34.307 回答
2

使用initWithCapacity:receiveData如果您已在属性中声明,则在这里您正在泄漏内存泄漏retain

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

或者

 NSMutableData * myData =  [[NSMutableData alloc] initWithCapacity:0];
   self.receiveData = myData ;
   [myData release];
    myData  = nil ;
于 2011-07-03T06:15:18.567 回答
1

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

于 2011-07-03T06:20:40.463 回答
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;
}

而且效果还不错,试试看。。。

于 2013-01-30T17:17:40.430 回答