Рассмотрим еще один вопрос, который спрашивают на iOS-собеседовании: есть ли разница при копировании массива и копировании структуры? Если есть, то какая? Данный вопрос тесно связан с механизмом Copy-on-Write. Посмотрим как он работает и разберем разницу между двумя типами копирования: поверхностным и глубоким копированием. Что такое механизм Copy-on-Write в Swift? Copy-on-Write — это специальный механизм, позволяющий … Продолжить чтение «В чем разница между копированием массива и структуры?»
Жизненный цикл объекта в Swift
У всех объектов в Swift есть свой собственный жизненный цикл (Object lifecycle). Он хорошо задокументирован в исходном коде. Жизненный цикл состоит из пяти состояний: Live, Deiniting, Deinited, Freed и Dead. Состояние Live При создании объекта он переходит в состояние Live. В этом состоянии счетчик ссылок выставлен минимум в 1. Например, у нашего объекта есть сильная … Продолжить чтение «Жизненный цикл объекта в Swift»
Управление памятью в Swift
Если на собеседовании вам не задавали вопросы про управление памятью, то уверяю вас, это дело времени. Что же вообще такое память? Это длинная последовательность байтов (если кто-то забыл, то 1 байт = 8 бит). Байты расположены упорядоченно, каждый байт имеет свой адрес в памяти. Когда мы создаем Value или Reference Type, то под наши объекты … Продолжить чтение «Управление памятью в Swift»
deinit: как и где вызывается?
deinit — деинициализация. Вызывается перед освобождением экземпляра класса. Деинициализаторы доступны только для классовых типов. Как правило, deinit не вызывается специально, что означает — не нужно вручную чистить память. Swift берет эту роль на себя, работает это при помощи автоматического подсчета ссылок (ARC). В ряде ситуаций, когда память нуждается в ручной очистке, вызывается деинициализатор, например, при … Продолжить чтение «deinit: как и где вызывается?»
Что такое Side table (Боковая таблица)?
Похожий вопрос редко встречается на собеседованиях, но это не значит, что тему стоит оставлять неизученной. Разберем понятие Боковая таблица или Side Table. Вкратце, Side Table — механизм, с помощью которого реализуются слабые ссылки. Не каждый объект содержит слабые ссылки, следовательно, и боковые таблицы, иначе это было бы расточительно. Вместо того чтобы напрямую указывать на объект, … Продолжить чтение «Что такое Side table (Боковая таблица)?»
Что такое ARC(Automatic Reference Counting)?
Тема про управление памятью — излюбленная тема на собеседовании. В этой статье мы рассмотрим два подхода управления памятью: ARC и MRC. MRC — Manual Reference Counter (ручное управление счетчиком ссылок) Каждый объект содержит некий счетчик, отображающий количество объектов, которые на него ссылаются (ссылки). При равенстве счетчика нулю — объекты освобождаются из памяти. В ситуации, когда объект освобождается, но счетчик ссылок остался не равен нулю, … Продолжить чтение «Что такое ARC(Automatic Reference Counting)?»
Механизм Copy-on-Write
В этой статье рассмотрим механизм Copy-on-Write и когда его можно использовать. Ранее мы уже рассматривали Reference Type и Value Type. Так вот, Value Type имеют семантику копирования — это когда вы присваиваете или передаете в качестве параметра функции экземпляр типа Value Type, то данные этого экземпляра будут скопированы. В итоге получится два одинаковых экземпляра, но … Продолжить чтение «Механизм Copy-on-Write»
Value Type и Reference Type или чем стек отличается от кучи?
Итак, разберемся что такое Value Type и Reference Type и чем стек отличается от кучи. В Swift есть две категории типов: Давайте разделим типы в Swift на две категории: Тип значения Ссылочный тип Int Функции Double Замыкания String Классы Array Dictionary Set Struct Enum Tuple Существует одно важное замечание — если экземпляр типа значения является … Продолжить чтение «Value Type и Reference Type или чем стек отличается от кучи?»
Retain Cycle
Одной из распространенных проблем, связанных с управлением памятью, является проблема Retain Cycle или цикл сильных ссылок. Retain Cycle — когда сущность A обладает сущностью B и наоборот. Утечка памяти происходит, когда содержимое остается в памяти даже после окончания его жизненного цикла. Это случается, когда два объекта имеют strong ссылки друг на друга. В подобном случае Swift просто … Продолжить чтение «Retain Cycle»