Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 使用NSMutableData但appendData失败_Iphone_Objective C_Nsmutabledata - Fatal编程技术网

Iphone 使用NSMutableData但appendData失败

Iphone 使用NSMutableData但appendData失败,iphone,objective-c,nsmutabledata,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.receive

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

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

我是Objective-C新手,你能帮我吗?

长度为
initWithLength:
和容量为
initWithCapacity:
之间有区别
initWithLength:
实际上在数据的开头提供了许多字节的0,而
initWithCapacity:
只是出于存储目的的提示。如果您试图从开头为0的数据中生成一个字符串,它将是一个空字符串。

initWithLength:
initWithCapacity:
之间存在差异
initWithLength:
实际上在数据的开头提供了许多字节的0,而
initWithCapacity:
只是出于存储目的的提示。如果您试图从开头为0的数据中生成一个字符串,它将是一个空字符串。

如果您在属性中声明
receiveData
retain
,则使用该命令,此时您将发生内存泄漏

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

如果您已在属性中声明
receiveData
retain
,则使用,此时您正在泄漏内存泄漏

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


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

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

我就是这样做的:

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;
}

而且效果很好,试试看……

我就是这样做的:

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;
}

它工作得很好,试试看……

@Gin:您可以将数据实例保留为
retain
,并使用我在回答中建议的解决方案,如果您将其保留为
retain
,也不要忘记在
dealoc
函数中释放您的数据实例。好的,我会按照您的建议,但是我想知道为什么retain比assign好,谢谢你,Jhaliya。@Gin:这完全取决于你在课堂上如何使用
实例变量。很难说哪个比其他更好。@Gin:您可以将数据实例保留为
retain
,并使用我在回答中建议的解决方案,如果您将其保留为
retain
,也不要忘记在
dealloc
函数中释放您的数据实例。好的,我会按照您的建议,但我想知道为什么retain优于assign,谢谢你,贾利亚。@Gin:这完全取决于你在课堂上如何使用
实例变量。很难说哪个比其他的好。@Gin:不客气!如果这回答了您的问题,请单击左侧的复选标记将其标记为答案。谢谢:)@Gin:不客气!如果这回答了您的问题,请单击左侧的复选标记将其标记为答案。谢谢:)