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

Nsdata to bytearray conversion. Memory issue and crash on iPad physical device

我正在使用以下代码将 nsdata 转换为 bytearray。它在模拟器中运行良好。在设备上,它疯狂地分配内存到 600 MB [在循环内的 'addobject' 行] 并崩溃。我正在阅读的文件大小为 30 MB。我在输出 windows 中看到的错误是 "memory issue"。该文件是 "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" 到 post json 到 REST Web 服务。

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

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

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

对于第二种方法,我可以想到两种方法:

  • 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
    

最后,如果数据在编码发送前能在客户端进行压缩就更好了!

希望对您有所帮助。