Подтвердить что ты не робот

График отладочной памяти Xcode, показывающий выпущенный объект

Я искал инструмент Graph Xcode Memory Graph для проекта и замечал какое-то странное поведение. Надеясь, что кто-то сможет объяснить, что происходит/если мне нужно волноваться.

У меня есть контроллер представления, который создает пару объектов (которые на данный момент мало что делают). Когда я достаточно увольняю контроллер представления, они освобождаются. Но один (иногда оба), кажется, висят в визуальном отладчике:

введите описание изображения здесь

Только два создаются, и оба обезврежены, подтверждены в моей консоли:

введите описание изображения здесь

Я думаю, что я прав, говоря, что я не несу ответственности за любой из объектов, ссылающихся на этот объект User на изображении выше, так что это ошибка, или просто что-то, о чем мне не нужно беспокоиться

4b9b3361

Ответ 1

Если вы не отвечаете за какой-либо из объектов в описанном графе, которые сохраняют объект User, вы не должны беспокоиться об этом.

FYI: Я испытал утечки, прежде чем включать Firebase в приложение. Это не ваша вина, и это не должно вызывать большой объем памяти.

Я согласен с @CharlesSrstka, если вы все еще обеспокоены утечками, вы можете проверить их тоже на инструментах, где он покажет вам определенную строку кода, которая может вызвать проблему.

Ответ 2

Был ли "освобожденный пользователь" зарегистрирован в методе deinit объекта? Если это так, объекты были деинициализированы, поэтому любые ссылки, показывающие, не смогли сохранить объект в живых. Учитывая это, я бы, наверное, не беспокоился об этом, хотя, если вы хотите быть уверенным, лучше всего запустить "Инструменты", загрузить инструмент "Распределение", щелкнуть кнопкой "Пуск" и нажать "Записать количество записей" ". Это позволит вам точно увидеть, что удерживает и отпускает ваши объекты.

Ответ 3

Я не уверен, что это то, что происходит с вами, но это случилось со мной, и это, оказывается, является следствием модели внутренней памяти Swift, в частности, как она обрабатывает слабые и неопубликованные ссылки.

Чтобы это применимо к вам, что-то должно было иметь слабую или неопубликованную ссылку на ваш объект User.

Если это так, когда удалена последняя сильная ссылка на ваш объект, объект будет деинициализирован - все, что он ссылается, будет иметь счетчик ссылок, уменьшенный и, если необходимо, будет освобожден, и его метод deinit() будет запущен (как показано в ваших журналах). Однако он не будет освобожден.

Да, объект может быть деинициализирован, но не освобожден! Причина этого в том, что слабая или неопубликованная ссылка, указывающая на этот объект, не должна позволять указывать на освобожденную (или, что еще хуже, перераспределенную) память, потому что после этого указателя создаст "небезопасное" поведение. В результате этот раздел памяти не может быть отброшен и, следовательно, объект не освобождается.

Две хорошие новости. Во-первых, просачивается только этот конкретный объект - ни один из объектов, которые он ссылается. Это означает, что просачивается только небольшая часть памяти. Так что это не может быть большой проблемой. Во-вторых, для слабых ссылок это поведение изменяется в Swift 4 (к сожалению, ссылки, не имеющие должного значения, будут по-прежнему иметь такое поведение). Было бы интересно попробовать ваш проект в бета-версии Xcode9 и посмотреть, все ли это происходит.

Это все из вопроса о том же типе вопроса на WWDC. Надеюсь, это окажется применимым!