React Native中的iOS websocket内存问题

问题描述 投票:11回答:2

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

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

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

Link to Github issue

Memory usage

Debug Info

Call tree

ios objective-c react-native websocket
2个回答
1
投票

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

所以我的第一次尝试是:

  1. 只需发送frameData并不复制它:

[self _handleMessage:frameData];

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

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();
};
© www.soinside.com 2019 - 2024. All rights reserved.