React Native中的iOS websocket内存问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React Native中的iOS websocket内存问题相关的知识,希望对你有一定的参考价值。

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

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

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

Link to Github issue

Memory usage

Debug Info

Call tree

答案

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

所以我的第一次尝试是:

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

[self _handleMessage:frameData];

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

这个问题终于可以解决了。在深入研究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();
};

以上是关于React Native中的iOS websocket内存问题的主要内容,如果未能解决你的问题,请参考以下文章

React-Native (iOS) 中的谷歌地图

React Native 中的原生 iOS 视图

react-native ios项目中的Firebase身份验证问题

React Native 中的套接字 io

React-native 应用程序永远不会重新启动以处理 iOS 中的位置更新

React Native 取消链接 Ios 库