React Native中的iOS websocket内存问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React Native中的iOS websocket内存问题相关的知识,希望对你有一定的参考价值。
我们在React Native中使用websocket blob实现时遇到内存泄漏,并且无法完全找到问题。
使用Xcode Instruments我们可以看到问题很可能发生在框架处理RCTSRWebSocket.m中的二进制消息的方式中,或者可能在RCTWebSocketModule.m的调用树中稍后处理
任何具有Object-C技能的人都能够看到为什么某些内存(可能是分配给收到的消息)没有正确发布?
答案
也许是我,但看起来frameData被复制了?这是NSData的参考类型,我不清楚为什么需要副本?这是必要的,因为它后来改变了,你希望原件保持不变?否则复制是完全没必要的,也许这对事情有点帮助?如果它正在读取的所有数据都被复制并且可能以某种方式保留在“_handleMessage”函数中,则可能导致大量内存分配。
所以我的第一次尝试是:
- 只需发送frameData并不复制它:
[self _handleMessage:frameData];
- 在_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项目中的Firebase身份验证问题