Проблема с памятью iOS в React Native

Мы испытываем утечку памяти при использовании реализации blob-реализации websocket в React Native и не можем найти проблему.

Используя Xcode Instruments, мы видим, что проблема, скорее всего, происходит в том, как структура обрабатывает двоичные сообщения в RCTSRWebSocket.m или, возможно, позже в дерево вызовов в RCTWebSocketModule.m

Любой, у кого есть навыки Object-C, которые могут понять, почему некоторая память (предположительно выделенная для принятых сообщений) не была правильно выпущена?

Ссылка на вопрос Github

Использование памяти

Debug Info

Дерево вызовов

Ответ 1

Наконец, проблема может быть решена. После копания в реализации WebSockets и особенно blobs я обнаружил, что все капли остаются в памяти, пока они не закрываются напрямую.

Это означает, что после того, как вы закончите с полученными данными, вы должны закрыть 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();
};

Ответ 2

Может быть, это мне, но кажется, что frameData скопирован? Это NSData так ссылочный тип, и мне непонятно, зачем нужна копия? Это необходимо, потому что оно изменилось впоследствии, и вы хотите, чтобы оригинал остался прежним? В противном случае копирование совершенно не нужно, и, возможно, это немного помогает? Если все данные, которые он читает, копируются и, возможно, каким-то образом сохраняются в функции "_handleMessage", могут привести к большим выделениям памяти.

Итак, мои первые попытки:

  • Просто отправьте frameData и не скопируйте его:

[self _handleMessage:frameData];

  1. Проверьте, можете ли вы принудительно установить frameData на нуль, как только вы закончите с ним в функции _handleMessage.