Swift iOS Interview Вопросы и ответы – Часть 4 – Управление памятью

Перевод статьи https://ishtiz.com/swift/swift-ios-interview-questions-and-answers-part-4

В этой статье я ответил на вопросы, связанные с одной из основных концепций интервью Swift iOS — управлением памятью. Я расскажу о некоторых основных концепциях управления памятью, таких как ARC, цикл сохранения, циклическая зависимость, цикл ссылок, список захвата, захват самого себя и т. д.

В: Как iOS справляется с управлением памятью?
О: iOS использует ARC или автоматический подсчет ссылок для управления памятью. ARC увеличивает счетчик сильных ссылок на 1, когда объект имеет сильную ссылку. Если нет строгой ссылки, значит счетчик сохранения равен нулю, и ARC освободит память.

В: Что такое ARC?
О: ARC/Automatic Reference Counting — это функция компиляции для управления памятью в iOS. При использовании ARC он освобождает память для объектов только тогда, когда на них нет сильных ссылок.

В: Что такое strong reference(сильная ссылка)?
О: Strong reference используются для описания отношений между объектами. Когда объект имеет сильную ссылку на другой объект, это создает цикл сохранения(retain cycle), который предотвращает освобождение объекта, на который ссылаются, и увеличивает счетчик сильных ссылок на единицу.

В: Что такое циклические зависимости?
О: Когда два или более модуля зависят друг от друга прямо или косвенно для правильной работы, создайте циклическую зависимость. Такие зависимости также называются взаимно рекурсивными.

В: Что такое retain cycle?
О: Retain cycle — это ситуация, когда два объекта имеют сильную ссылку друг на друга, это создает цикл сохранения, поскольку оба объекта пытаются сохранить друг друга, что делает невозможным освобождение. В основном это происходит в классах и замыканиях. Замыкания живут в памяти, поэтому, когда вы используете self, которое является ссылкой, вам нужно убедиться, что вы решаете цикл сохранения.

В: Что такое утечка памяти?
О: Утечка памяти происходит, когда объект остается в памяти даже после завершения его жизненного цикла. Это часть памяти, которая остается выделенной, но никогда не используется. Вам следует избегать отношения объектов через сильную ссылку друг к другу, которое создает цикл сохранения(retain cycle), который приводит к утечке памяти.

В: В чем разница между передачей параметра и копированием параметра?
О: В случае сохранения объекта мы делимся одной и той же версией с тем, кто передал нам объект. Вызов удержания объекта увеличит его счетчик удержания на единицу. Когда счетчик сохранения объекта достигает нуля, объект освобождается и освобождается из памяти. С другой стороны, когда мы копируем объект, мы не будем использовать одну и ту же версию объекта, мы просто создадим дубликат этого объекта. Скопированный объект будет иметь счетчик сохранения, равный единице, как и вновь инициализированный объект.

В: Объясните цикл сильных ссылок в замыканиях?
О: Чтобы замыкание выполнялось позже, оно должно сохранять все переменные, необходимые для его запуска. Замыкание по умолчанию захватывает такие же сильные ссылки, как и класс. Если вы присваиваете замыкание свойству экземпляра класса, а тело этого замыкания захватывает экземпляр, может возникнуть сильный цикл ссылок. Сильная ссылка может возникать из-за того, что тело замыкания обращается к свойству/методу экземпляра (например, self.testProperty/self.testMethod() – в обоих случаях такие обращения приводят к тому, что замыкание захватывает себя и создает цикл строгой ссылки).

В: Что такое список захвата(capture list)?
О: Список захвата — это процедура обработки захваченных в нем ссылок. По умолчанию на все будут строго ссылаться, если вы не используете список захвата. Списки захвата определяются со слабым префиксом weak или unowned. Нам нужно определить переменную захвата как weak, если она может стать равной нулю и замыкание не будет освобождено до этого. Нам нужно определить захваченную ссылку как unowned, если она никогда не станет нулевой до того, как замыкание будет освобождено.

В: В чем разница между сборщиком мусора и ARC?
О: Технически ARC — это форма сборки мусора, но детерминированное решение: предсказуемо, когда это произойдет. Такие языки, как java и C#, используют недетерминированный сборщик мусора. Это означает, что вы не можете точно сказать, когда объекты уничтожаются, потому что среда выполнения управляет внешним процессом.

Главное преимущество ARC в том, что это детерминированное поведение и предсказуемая деинициализация. Объекты освобождаются немедленно, когда они больше не нужны.

Однако ARC не может работать с циклами сильных ссылок без вмешательства разработчика. С другой стороны, главное преимущество сборщика мусора состоит в том, что он может обнаруживать циклы ссылок.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *