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

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

Младшим разработчикам вопросы по управлению памятью могут помочь оценить их понимание основных концепций программирования и их способность писать эффективный и стабильный код. Младшим разработчикам могут задавать вопросы о подсчете ссылок, ARC, сильных и слабых ссылках и о том, как избежать циклов сильных ссылок.

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

Как iOS справляется с управлением памятью?

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

Что такое ARC?

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

Что такое сильная ссылка?

В iOS сильная ссылка — это ссылка на объект, которая предотвращает освобождение объекта, пока существует хотя бы одна сильная ссылка. Сильная ссылка увеличивает счетчик ссылок на объект, и когда счетчик ссылок достигает нуля, объект освобождается.

Сильные ссылки — это наиболее распространенный тип ссылок в iOS, и они создаются всякий раз, когда объект присваивается переменной или свойству. Например, если у вас есть свойство, объявленное следующим образом:

myObject: MyClass?

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

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

Что такое циклические зависимости?

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

Что такое удержание циклов?

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

Что такое утечка памяти?

Утечка памяти происходит, когда объект остается в памяти даже после завершения его жизненного цикла.

Утечка памяти — это часть памяти, которая остается выделенной, но никогда не используется. Вам следует избегать сильного отношения к сильному, которое создает цикл сохранения, который приводит к утечке памяти.

В чем разница между сохранением и копированием?

В случае сохранения объекта Мы делимся одной и той же версией с тем, кто передал нам объект. Вызов удержания объекта увеличит его счетчик удержания на единицу. Когда счетчик сохранения объекта достигает нуля, объект освобождается и освобождается из памяти.

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

Объясните цикл сильных ссылок в замыканиях.

Чтобы замыкание выполнялось позже, оно должно сохранять все переменные, необходимые для его запуска. Замыкание по умолчанию захватывает такие же сильные ссылки, как и класс. Если вы присваиваете замыкание свойству экземпляра класса, а тело этого замыкания захватывает экземпляр, может возникнуть сильный цикл ссылок.

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

Что такое список захвата?

Список захвата — это процедура обработки захваченных в нем ссылок. По умолчанию на все будут строго ссылаться, если вы не используете список захвата. Списки захвата определяются со слабым префиксом ключевого слова или без него. Нам нужно определить переменную захвата как слабую, если она может стать равной нулю и замыкание не будет освобождено до этого. Нам нужно определить захваченную ссылку как бесхозяйную, если она никогда не станет нулевой до того, как замыкание будет освобождено.

В чем разница между сборщиком мусора и ARC?

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

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

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

Что такое подсчет ссылок в iOS?

Подсчет ссылок — это система в iOS, которая отслеживает количество ссылок на объект и автоматически освобождает объект, когда на него нет ссылок. Каждый объект в iOS имеет счетчик ссылок, который увеличивается всякий раз, когда создается ссылка на объект, и уменьшается, когда ссылка удаляется. Когда счетчик ссылок достигает нуля, объект освобождается.

Преимущество ARC в iOS

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

Как ARC обрабатывает слабые ссылки в iOS?

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

Какова связь между сильным эталонным циклом и утечкой памяти?

Цикл сильных ссылок — это ситуация, когда два или более объекта имеют сильные ссылки друг на друга, что приводит к утечке памяти. Поскольку счетчик ссылок ни на один из объектов не может достичь нуля, они не могут быть освобождены, и их память остается выделенной, даже если они больше не нужны. Чтобы избежать циклов сильных ссылок, важно использовать слабые ссылки, когда это уместно, и понимать, как разбивать циклы ссылок в коде.

Что такое ручное управление памятью в iOS?

Ручное управление памятью — это система, в которой разработчики несут ответственность за управление памятью объектов в своих приложениях. Это включает в себя отслеживание счетчиков ссылок, освобождение объектов, когда они больше не нужны, и использование таких методов, как сохранение и освобождение, для управления временем существования объектов. Ручное управление памятью использовалось в более ранних версиях iOS, но с тех пор было заменено ARC.

Уважаемые разработчики iOS, имейте в виду

При подготовке к собеседованию важно помнить о нескольких ключевых моментах. Во-первых, стоит отметить, что в разделе интервью доступно более 1000 вопросов для интервью, которые вы можете просмотреть и подготовиться. Читая вопрос, найдите время, чтобы тщательно обдумать свой ответ и обдумать информацию, которую вы хотите передать. Ответ, представленный здесь, в этом блоге, можно объяснить по-другому. Вы также должны подготовить свои примеры.

Также важно помнить, что эти вопросы на собеседовании не должны быть трудными. Интервьюер не хочет бросить вам вызов, а хочет начать разговор, который позволит вашим способностям и интересам выйти на первый план. Они хотят лучше узнать вас и ваш опыт.

Наконец, очень важно избегать простых ответов «да» или «нет». Интервьюеры ищут более подробные ответы, которые включают базовое понимание, рассуждение, объяснение и примеры. Итак, постарайтесь уточнить свои ответы и предоставить конкретную актуальную информацию в поддержку вашего ответа. Это продемонстрирует вашу внимательность и покажет интервьюеру, что вы хорошо подготовились к интервью.e