当我使用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的新手,你可以帮助我吗?
答案 0 :(得分:3)
initWithLength:
和initWithCapacity:
之间存在差异。 initWithLength:
实际上在数据开头给了你很多0的字节,而initWithCapacity:
只是一个存储用的提示。如果你尝试用开头的0来创建一个字符串,那么它将是一个空字符串。
答案 1 :(得分:2)
使用initWithCapacity:,如果您已在自己的财产中声明receiveData
为retain
,则会泄漏内存泄漏。
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;
}
它运作得很好,试一试......