Может быть сложно отследить циклы сохранения в Xcode. Эта статья (с примером) поможет вам использовать эту замечательную функцию!
Сложность: Новичок | Легко | Нормальный | Сложно
Эта статья была разработана с использованием Xcode 11.5 и Swift 5.2.4.
Циклы сохранения могут вызвать утечки памяти. Если корневой объект создает группу объектов, которые удерживаются друг на друге сильными ссылками, а затем эта группа освобождается, ее невозможно освободить вместе с памятью.
Это связано с тем, что используется подсчет ссылок, и каждый раз, когда ссылка удаляется, счетчик уменьшается на единицу, и объект может быть освобожден только тогда, когда счетчик ссылок для этого объекта равен нулю.
Цикл ссылок означает, что счетчик ссылок никогда не может достичь нуля, а объекты не могут быть освобождены, что приводит к утечке памяти — а это означает, что используемая память никогда не освобождается обратно для использования в системе.
У нас есть два класса: a Parentи Childclass. Теперь родителю необязательно иметь одного дочернего элемента (в этом примере), и у дочернего элемента всегда есть один родительский элемент.
В свойствах Swift есть сильные ссылки (в отличие от слабых или unowned ), поэтому здесь все ссылки сильные.
Цикл сохранения происходит между родительским и дочерним элементами — ни один из них не может быть освобожден, даже если экземпляр UIViewController, создавший их, больше не существует. Кстати говоря, вот экземпляр, UIViewControllerкреативно названный как ViewController:
Таким образом, UIViewControllerсоздается Parentи Child, которое будет сохранено, даже если ViewControllerбольше не существует, потому что оно Childудерживается Parent(и наоборот) с сильными ссылками.
Все это можно загрузить из репозитория , чтобы вы могли увидеть это на практике.
Когда мы запускаем проект, ничего плохого не происходит. Большой!
Однако собеседование, которое у вас есть, отклонит вас на цикл удержания.
Давайте воспользуемся отладчиком памяти Xcode, чтобы увидеть цикл памяти.
Итак, запустив проект, в правом нижнем углу окна Xcode мы видим следующую панель инструментов:
давайте сделаем это шаг за шагом: значок отладчика памяти выделен красным прямоугольником на следующем изображении:
то есть щелкните следующее изображение:
Xcode потребуется секунда, чтобы построить график памяти, и вы должны увидеть проблему. Вы увидите фиолетовый! в левой части экрана.
Нажав на два фиолетовых восклицательных знака, мы получим пару изображений, показывающих цикл хранения. Мы также можем увидеть информацию о том, какие классы Childи Parentявляются проблемой. Что ж, в данном случае мы это знаем, но в будущем нам следует использовать эту функцию и поблагодарить за это Xcode!
В этом цикле все сильно! Мы можем это исправить, ослабив связь Parent-> Child.
Возвращаясь к графику памяти, мы видим, что цикла сохранения больше нет.
Радость!
В Xcode есть отличные инструменты, и некоторые предпочитают их использовать. Однако отладчик визуальной памяти — отличный инструмент, позволяющий нам увидеть эти неприятные проблемы, которые могут возникнуть в вашем коде.
Это еще один замечательный инструмент, который есть в нашем распоряжении!
Если у вас есть какие-либо вопросы, комментарии или предложения, напишите мне в Twitter.
На этой неделе я получил электронное письмо от участника ежедневного списка рассылки. Они хотели знать: какие ресурсы вы посещаете ежедневно, еженедельно и ежемесячно? Отличный вопрос! Я рад поделиться некоторыми мыслями о моем рабочем процессе и основных ресурсах, которые я использую.
Терминалы, оболочки и инструменты командной строки, устанавливающие стандарт в 2023 году. Все разработчики используют терминалы; для некоторых весь рабочий процесс — это терминал Этот пост знакомит с Hypermodern Terminal Toolbox — терминалом, оболочкой и инструментами командной строки, устанавливающими стандарт в 2023 году Kitty как эмулятор терминала Kitty — это эмулятор терминала — альтернатива терминалу GNOME , Alacritty или Терминал Windows.
«Он защитит меня, когда я в опасности. Он спрячет меня в своей палатке.
Когда вы вырастаете, вам, как правило, говорят, что мир такой, какой он есть, и ваша жизнь состоит в том, чтобы просто жить своей жизнью внутри мира, никогда не рискуя своей жизнью, просто следовать установленному пути и умереть в конце, и стараться не слишком сильно бить стены. Но это очень ограниченная жизнь.
В современном быстро меняющемся и конкурентном мире карьера играет важную роль в личностном росте, финансовой стабильности и общей удовлетворенности жизнью. Однако многие люди оказываются в безжалостном цикле застоя и неудовлетворенности, постепенно угасая в своей профессиональной жизни.
Мы часто обнаруживаем, что изо всех сил пытаемся реализовать то, что, как мы знаем, полезно для нас. От того, чтобы сказать значимому другому, что мы любим его, до того, чтобы помнить, что нужно говорить как пират, всегда будут те, кто утверждает, что день, неделя или месяц событий не нужны, потому что они уже делают эти вещи.