在React Native中使用websocket blob实现时,我们遇到了内存泄漏,并且无法完全找到问题。
使用Xcode Instruments,我们可以看到问题很可能发生在框架处理RCTSRWebSocket.m中的二进制消息或者稍后在RCTWebSocketModule.m的调用树中处理二进制消息的方式
任何具有Object-C技能的人都能够看到为什么某些内存(可能是对收到的消息进行了分配)没有被正确发布?
答案 0 :(得分:1)
也许是我,但看起来frameData被复制了?它的NSData是参考类型,我不清楚为什么需要副本?这是必要的,因为它之后发生了变化而您希望原件保持不变吗?否则复制是完全没必要的,也许这对事情有点帮助? 如果它所读取的所有数据都被复制,并且可能以某种方式保留在' _handleMessage'它可以导致大内存分配。
所以我的第一次尝试是:
[self _handleMessage:frameData];
答案 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();
};