【问题标题】:Use NSMutableData but appendData failed使用 NSMutableData 但 appendData 失败
【发布时间】:2011-07-03 06:09:54
【问题描述】:

当我用 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 的新手,你能帮我吗?

【问题讨论】:

    标签: iphone objective-c nsmutabledata


    【解决方案1】:

    initWithLength: 和 initWithCapacity: 之间存在差异。 initWithLength: 实际上在数据开头为您提供了那么多字节的 0,而 initWithCapacity: 只是用于存储目的的提示。如果你尝试用以0开头的数据组成一个字符串,它将是一个空字符串。

    【讨论】:

    • @Gin:不客气!如果这回答了您的问题,请单击左侧的复选标记将其标记为答案。谢谢:)
    【解决方案2】:

    使用initWithCapacity:,如果您在您的属性中将receiveData 声明为retain,那么您将在此处发生内存泄漏。

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

    或

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

    【讨论】:

    • @Gin:您可以将数据实例保留为retain 并使用我的回答中建议的解决方案,如果您将其保留为@987654328,也不要忘记在dealloc 函数中释放您的数据实例@.
    • 好的,我会听从你的建议,但我想知道为什么保留比分配更好,谢谢你,Jhaliya。
    • @Gin :这完全取决于你将如何在课堂上使用instance variable。很难说哪个比其他更好..
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我就是这样做的:

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

      而且效果还不错,试试吧……

      【讨论】:

        猜你喜欢
        • 2012-02-01
        • 1970-01-01
        • 2015-06-28
        • 1970-01-01
        • 1970-01-01
        • 2020-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多