React Native

时间:2017-11-20 15:10:15

标签: ios objective-c react-native websocket

在React Native中使用websocket blob实现时,我们遇到了内存泄漏,并且无法完全找到问题。

使用Xcode Instruments,我们可以看到问题很可能发生在框架处理RCTSRWebSocket.m中的二进制消息或者稍后在RCTWebSocketModule.m的调用树中处理二进制消息的方式

任何具有Object-C技能的人都能够看到为什么某些内存(可能是对收到的消息进行了分配)没有被正确发布?

Link to Github issue

Memory usage

Debug Info

Call tree

2 个答案:

答案 0 :(得分:1)

也许是我,但看起来frameData被复制了?它的NSData是参考类型,我不清楚为什么需要副本?这是必要的,因为它之后发生了变化而您希望原件保持不变吗?否则复制是完全没必要的,也许这对事情有点帮助? 如果它所读取的所有数据都被复制,并且可能以某种方式保留在' _handleMessage'它可以导致大内存分配。

所以我的第一次尝试是:

  1. 只需将frameData发送到并且不要复制它:
  2. [self _handleMessage:frameData];

    1. 在_handleMessage函数中完成后,检查是否可以强制将frameData设置为nil。

答案 1 :(得分:1)

这个问题终于可以解决了。在深入研究WebSockets的实现,尤其是blob之后,我发现只要它们没有被直接关闭,所有blob都会留在内存中。

这意味着在您完成收到的数据后,您应该按照以下方式关闭Blob:

ws.onmessage = function (e) {
  // Do whatever with the data through e.data.
  const data = e.data;
  // When you are done with the received data, you must close the Blob:
  e.data.close();
};