Nsdata到bytearray的转换。内存问题和iPad物理设备崩溃

时间:2017-07-21 15:11:50

标签: objective-c arrays memory-leaks nsmutablearray nsdata

我使用以下代码将nsdata转换为bytearray。它在模拟器中工作正常。在设备上,它将疯狂的内存分配到600 MB [在循环内的'addobject'行上]并崩溃。我正在阅读的文件大小为30 MB。我在输出窗口中看到的错误是“内存问题”。该文件是“zip”文件

NSData *data = [[NSData alloc] initWithContentsOfFile:file];
const unsigned char *bytes = [data bytes];
NSUInteger length = [data length];
NSMutableArray *byteArray = [NSMutableArray array];
for (NSUInteger i = 0; i < length; i++) {
@autoreleasepool {
         [byteArray addObject:[NSNumber numberWithUnsignedChar:bytes[i]]];                                                  }
       }

我在NSDictionary中使用这个bytearray并在字典上执行“dataWithJSONObject”以将json发布到REST Web服务。

1 个答案:

答案 0 :(得分:0)

有关将NSData转换为字节数组的更高内存效率的方法,请参阅How to convert NSData to byte array in iPhone?

如果您的目标是最终将二进制数据发布到JSON中的Web服务,请尝试以下操作:

  1. Base64-对字符串中的数据进行编码,如here所述。这可以在JSON Body中传递。
  2. 或者,如果您可以灵活地更改此传输的服务器端,请避免使用JSON中的base64编码数据,而是使用HTTP POST或PUT直接发布二进制内容。这样会更有效率。
  3. 对于第二种方法,我可以想到两种方法:

    • Here is an example for the scenario of sending an image,但只要您可以将其加载到NSData对象中,任何文件类型都将起作用。

    • 或者,这样的事情应该有效

      NSData *data = [NSData dataWithContentsOfFile:file];
      NSURL *url = [NSURL URLWithString:@"your_url_here"];
      NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
      [request setHTTPMethod:@"PUT"];
      NSDictionary *headers = @{@"Content-Type": @"application/octet-stream"};
      [request setAllHTTPHeaderFields:headers];
      [request setHTTPBody:data]
      // Use an URLSession object task to execute the request
      

    最后,如果在编码和发送之前可以在客户端上压缩数据,那就更好了!

    我希望你觉得这很有用。