代码之家  ›  专栏  ›  技术社区  ›  teeboy

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

  •  1
  • teeboy  · 技术社区  · 7 年前

    我使用以下代码将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]]];                                                  }
           }
    

    1 回复  |  直到 7 年前
        1
  •  0
  •   kevdoran    7 年前

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

    1. Base64将数据编码为字符串,如所述 here 。这可以在JSON正文中传递。
    2. 或者,如果您可以灵活地更改此传输的服务器端,请避免使用JSON中的base64编码数据,而是使用HTTP post或PUT直接发布二进制内容。这将更有效率。

    • Here is an example for the scenario of sending an image

    • 或者,像这样的事情应该管用

      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
      

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

    我希望这对你有帮助。