Основные вопросы и ответы на собеседовании по основам iOS

По данным Backlinko, около 1 миллиарда человек по всему миру используют iPhone. С появлением пользователей Apple TV и Apple Watch рынок продолжает расширяться, а инженеры-программисты iOS пользуются большим спросом.

Нехватка талантов приводит к тому, что зарплаты все выше и выше, даже для должностей начального уровня. Разработка программного обеспечения также является одной из немногих удачных работ, которыми можно заниматься удаленно. Понятно, что все больше и больше людей хотят стать iOS-разработчиком.

В этой статье я включу общие вопросы интервью, как часто они будут возникать, и как я лично ответил бы на эти вопросы.

Я буду ранжировать редкость по тому, как часто возникают вопросы во время моих интервью:

Редко (1–3 раза из 10)

Нечасто (4–6 раз из 10)

Обычный (7–9 раз из 10)

Каждый раз! (10 раз из 10)

Надеюсь, после прочтения этой статьи вы сможете получить ту работу iOS-разработчика, которую хотели. Я также включу способ значительно повысить ваши шансы на успех на собеседовании в конце этой статьи 😉

Базовое объектно-ориентированное программирование

1. Какова связь между классом и объектом?

  • Класс — это шаблон объекта, который определяет свойства и поведение. А объект — это экземпляр класса. пример:
  • Class MainViewController: UIViewController {} ← Class Declaration
  • let vc: UIViewController = UIViewController() ← Object Definition

Редкость: необычная

Примечания. Хотя этот вопрос встречается не так часто, если вы не сможете ответить на него, это произведет плохое впечатление, поскольку это очень простой вопрос.

2. Пожалуйста, объясните 4 столпа ООП

  • Абстракция.

Абстракция — это концепция ООП, с помощью которой мы раскрываем соответствующие данные и методы объекта, скрывая их внутреннюю реализацию.

  • Инкапсуляция.

Инкапсуляция — это концепция, с помощью которой мы скрываем данные и методы от внешнего вмешательства и использования.

  • Наследование.

Наследование определяется как процесс, посредством которого дочерний класс наследует свойства родительского класса.

  • Полиморфизм.

Объекты одного класса могут вести себя независимо в одном и том же интерфейсе.

подробнее о 4 столпах читайте здесь: https://medium.com/swift-india/oops-in-swift-998738407423

Редкость: Редкий

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

3. Пожалуйста, объясните разницу между Struct и Class

  • Struct — это тип значения, а Class — это ссылочный тип.
  • Ссылочный тип передает объект по его адресу памяти, а тип значения передает значение.
  • Классы также могут быть унаследованы, а структуры — нет. Оба могут соответствовать протоколам в Swift.

Редкость: Каждый раз!

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

4. Метод переопределения против метода перегрузки

  • Перегрузка методов — это процесс, при котором у класса есть два или более метода с одинаковыми именами, но разными параметрами.
  • Переопределение — это процесс, при котором два метода имеют одно и то же имя и параметры. Один из методов находится в родительском классе, а другой — в дочернем классе. Примером является то, как мы переопределяем метод viewDidLoad() в нашем классе ViewController.

Редкость: Редкий

Примечания: То же, что и 4 столпа, фундаментальный вопрос, который выходит за рамки роли iOS-разработчика.

Шаблоны проектирования

1. Пожалуйста, объясните шаблон MVC (Model-View-Controller), каковы его плюсы и минусы?

  • M- Model, уровень модели в MVC должен содержать и представлять данные вашего приложения.
  • V- View, уровень представления в MVC, должен обрабатывать логику интерфейса вашего приложения и контролировать объекты, с которыми могут взаимодействовать ваши пользователи. По сути, все производные объекты UIView.
  • C-controller, уровень контроллера в MVC является посредником между представлением и моделью. Он получает доступ к данным в модели и соответствующим образом настраивает представление.
  • Плюсы: MVC является наиболее распространенным и используемым шаблоном проектирования в среде iOS. Его легко освоить, люди могут легко к нему адаптироваться, и большинство iOS-разработчиков знакомы с ним.
  • Минусы: Контроллер несет слишком большую ответственность в этом шаблоне. В сообществе шутят, что MVC расшифровывается как Massive-View-Controllers из-за того, насколько запутанными являются классы контроллеров в этом шаблоне.

Редкость: Каждый раз!

Примечания: вам абсолютно необходимо знать, что такое MVC, так как это необходимо для любой разработки iOS. Существуют и другие распространенные архитектуры, такие как MVVM, VIPER и MVP, которые вы можете изучить, но MVC будет первой в списке для разработки под iOS. Если вас спросят о шаблоне проектирования, с которым у вас нет опыта, лучше сказать об этом, чем пытаться объяснить что-то, что вы прочитали в Интернете, но не имеете опыта.

2. Объясните шаблон Singleton. Каковы его плюсы и минусы?

  • Шаблон проектирования Singleton гарантирует, что для данного класса существует только один экземпляр и что существует глобальная точка доступа к этому экземпляру. Например, когда вы используете такие экземпляры, как UserDefaults.standard или DispatchQueue.main.
  • Плюсы: к нему можно получить доступ везде, поэтому его легко получить независимо от того, из какого класса вы пытаетесь его использовать.
  • Минусы: поскольку к нему можно получить доступ везде, разработчики могут легко им злоупотреблять, и может быть трудно отследить, где данные манипулируются, если они изменяются в слишком многих местах.

Редкость: Обычный

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

3. Объясните паттерн Наблюдатель. Каковы его плюсы и минусы?

  • В шаблоне проектирования Observer наблюдаемый объект, называемый Observable, будет транслировать все свои изменения любым объектам, которые его наблюдают (наблюдателям). Примером шаблона Observer в iOS может быть NotificationCenter.
  • Плюсы: очень удобно использовать, так как вы можете запустить метод при обнаружении изменений.
  • Минусы: может быть трудно отслеживать поток, если слишком много наблюдателей наблюдают за одним и тем же наблюдаемым.

Редкость: Обычный

Примечания. В iOS есть больше шаблонов проектирования, таких как Facade, Adapter, Decorator и т. д. По моему опыту, чаще всего задают Singleton и Observer. Опять же, если вас спросят о шаблоне проектирования, с которым у вас нет опыта, лучше сказать об этом, чем пытаться объяснить что-то, что вы прочитали в Интернете, но не имеете опыта.

Views and Interface Builder

1. В чем разница между frame и bounds?

  • frame view — это его расположение и размер в соответствии с системой координат его родителя.
  • bounds view — это его местоположение и размер в соответствии с его собственной системой координат.
  • Например, вы создаете представление в координатах x:0 y:0, ширина: 50, высота: 50. Когда вы перемещаете координату вида, рамка вида отразит изменение, а его границы — нет.
  • То же самое произойдет, когда вы попытаетесь повернуть вид. Рамка представления отразит изменение, а границы — нет. Потому что внутренне в представлении он не изменился
  • пример кода:

Редкость: Обычный

Примечания: Еще один часто задаваемый вопрос. Вы можете легко перепутать их друг с другом, поэтому обязательно попробуйте их заранее!

2. Назовите дерево наследования UIButton

NSObject — UITouch — UIView — UIControl — UIButton

Редкость: Редкий

Примечания. Хотя специально спрашивать дерево наследования UIButton редко, интервьюеры любят спрашивать о классах и поведении, которое оно наследует от родителя.

3. Объясните, как вы будете создавать этот интерфейс в своем приложении.

Есть много способов создать это, используя раскадровку, программно, xib и т. д. Просто объясните, какой способ создания вам наиболее удобен. Объясните, как можно разместить все в середине экрана, возможно, используя центр, ширину и высоту суперпредставления. Объясните, как вы можете разместить надпись относительно изображения и как размещение нижней метки относительно ее верхней метки. Не забудьте упомянуть autolayout, если вы его используете.

Редкость: необычная

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

4. В чем разница между UICollectionView и UITableView? Когда какой использовать?

  • UICollectionView позволяет прокручивать по горизонтали и по вертикали. Пока UITableView позволяет только вертикальную прокрутку
  • UICollectionView имеет UICollectionViewDelegateFlowLayout, который дает вам возможность управлять потоком
  • UICollectionView позволяет пользователю динамически изменять размер и форму каждой ячейки.
  • UICollectionView также поддерживает пользовательские анимации в различных типах макетов.

Редкость: Обычный

Примечания: один из самых полезных инструментов для создания макета в iOS. Интервьюеры будут смотреть на ваш опыт работы с каждым инструментом.

Жизненный цикл приложения

В этой статье @pleelaprasad блестяще объясняется жизненный цикл приложения iOS. Я попытаюсь обобщить его для вопросов интервью здесь

1. Каковы состояния приложения iOS? Кратко поясните их.

  • Not Running/Terminated — состояние, когда приложение не запущено или было завершено.
  • Inactive — состояние, когда приложение работает на переднем плане, но не получает никаких событий. Наиболее распространенный способ достичь этого состояния — получить звонок при использовании приложения. Это состояние также может быть достигнуто при переходе между другими состояниями. Пользовательский интерфейс приложения не может взаимодействовать в этом состоянии
  • Активный — нормальное состояние приложения переднего плана. Приложение работает на переднем плане и получает события. Это состояние, когда пользователь использует приложение и взаимодействует с ним.
  • Фон — приложение работает в фоновом режиме и все еще может выполнять код. Когда вы сворачиваете приложение, оно переходит в это состояние ненадолго, обычно около 5 секунд, прежде чем перейти в состояние приостановки.
  • Приостановлено — приложение находится в фоновом режиме и не выполняет никаких кодов. Это состояние достигается системой автоматически и не уведомляет. Когда система обнаруживает нехватку памяти на устройстве, она может удалить приложения, находящиеся в приостановленном состоянии, без уведомления об этом.

Редкость: Обычный

Примечания: хотя точные ответы на все состояния — это хорошо, отсутствие некоторых вещей делает вас человеком. Некоторые состояния используются чаще, чем другие, и некоторые приложения могут даже не касаться определенного состояния. Ответьте по своему опыту.

2. Что происходит, когда пользователь проводит пальцем вверх или нажимает кнопку «Домой», чтобы свернуть приложение?

Приложение, которое находится на переднем плане, на короткое время перейдет из активного состояния в неактивное. Затем приложение перейдет в фоновое состояние и обработает любое конечное событие, которое ему необходимо. Через несколько секунд приложение будет переведено в состояние «Приостановлено». Если системе требуется больше памяти для текущего приложения переднего плана, приостановленное приложение может быть прекращено.

Редкость: Обычный

Примечания: Об этом особо нечего сказать. Часто задаваемый вопрос и довольно простой ответ

Управление памятью

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

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

Редкость: Каждый раз!

Примечания: Другой должен знать! Управление памятью очень важно в любом приложении, особенно в приложениях iOS, которые имеют ограничения памяти и других аппаратных и системных ограничений. Утечки памяти и сбои приложений слишком распространены из-за плохого управления памятью в приложениях iOS.

2. Что такое strong и weak ссылка?

  • strong — когда вы объявляете сильную ссылку на объект, вы говорите ARC не освобождать объект, когда на него все еще есть ссылки. Это также увеличивает количество удержаний на 1.
  • weak. Слабая ссылка — это ссылка, которая не удерживает сильного экземпляра, на который ссылается, и поэтому не мешает ARC избавиться от экземпляра, на который ссылается. ARC изменит слабую ссылку на nil при освобождении. Из-за этого слабая ссылка не может быть константой (let) и должна быть переменной (var)

Редкость: Каждый раз!

Примечания: Как упоминалось ранее, управление памятью очень важно в разработке iOS, поэтому этот вопрос возникнет естественным образом как дополнительный вопрос, заданный ранее. В Objective-C, помимо слабого и сильного, есть еще такие типы, как присваивать и сохранять.

3. Что такое цикл удержания и как его решить?

  • Цикл сохранения происходит, когда по крайней мере 2 объекта содержат сильную ссылку друг на друга. Таким образом, предотвращается освобождение объекта с помощью ARC, предотвращается нулевое значение счетчика сохранения и предотвращается освобождение памяти.
  • Чтобы решить эту проблему, вам нужно уменьшить счетчик сохранения до 0. Один из способов сделать это — сделать сильные ссылки слабыми ссылками.

Редкость: Каждый раз!

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

Управление потоками

1. Какие существуют потоки в iOS?

От высокого к низкому приоритету с объяснением, когда использовать:

Редкость: необычная

Примечания: Хотя интервьюеры не часто просят вас назвать все QoS, важно знать, что в iOS есть разные потоки, и, по крайней мере, вы должны быть в состоянии назвать основной поток и фоновый поток.

2. Что такое последовательная и параллельная очередь?

Из документации разработчика Apple:

  • Последовательные очереди (также известные как частные очереди диспетчеризации) выполняют одну задачу за раз в том порядке, в котором они добавляются в очередь. Текущая выполняемая задача выполняется в отдельном потоке (который может варьироваться от задачи к задаче), который управляется очередью отправки. Последовательные очереди часто используются для синхронизации доступа к определенному ресурсу.
  • Параллельные очереди (также известные как тип глобальной очереди диспетчеризации) выполняют одну или несколько задач одновременно, но задачи по-прежнему запускаются в том порядке, в котором они были добавлены в очередь. Текущие выполняемые задачи выполняются в отдельных потоках, которые управляются очередью отправки. Точное количество задач, выполняемых в любой данный момент, является переменным и зависит от состояния системы.

Редкость: необычная

Примечания: этот вопрос может быть сформулирован по-разному или задан по-другому. Вместо этого они могут спрашивать о синхронных и асинхронных задачах.

3. Что такое состояние гонки?

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

Редкость: Редкий

Примечания: хотя этот вопрос и не является часто задаваемым, он может повысить впечатление на ваших интервьюеров, если вы сможете ответить на него с опытом.

Место хранения

1. Какие параметры сохраняемости данных доступны в iOS и когда какие использовать?

  • UserDefaults- UserDefaults прост в использовании. К нему можно получить доступ во всем приложении, оно может конфликтовать с ключами, поскольку оно использует ключи для хранения значений. Данные внутри UserDefaults не шифруются.
  • CoreData — CoreData позволяет сохранять настраиваемые объекты данных. Не очень прост в использовании и должен быть изучен, прежде чем полностью освоить его. Необходимо также следить за потокобезопасностью.
  • FileManager — FileManager сохраняет данные, используя URL-адреса. Его можно использовать с iCloud, он также может сохранять большие объекты, такие как фотографии. URL-пути могут быть подвержены ошибкам. Процесс чтения/сохранения может быть медленным.
  • Keychain. Основное преимущество использования Связки ключей заключается в том, что данные шифруются для обеспечения безопасности. Хотя скорость может быть ниже и не рекомендуется для больших объектов. Полезно для сохранения конфиденциальных данных, таких как электронные письма, номера телефонов и т. д.
  • plist-plist прост в использовании, он хранит некоторые значения приложения. Однако он может хранить только небольшие объекты или типы данных.

Редкость: Обычный

Примечания: В большинстве случаев они не ожидают, что вы назовете все варианты, а только тот, с которым у вас есть опыт. Или они могут специально спросить, как работают UserDefaults или Keychain, и не заботиться об остальном. Однако знать о UserDefaults необходимо, так как это наиболее распространенные данные сохранения, используемые в iOS.

Другие распространенные вопросы

1. Почему мы используем dequeueReusableCellWithIdentifier в представлениях таблиц и представлений коллекций?

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

Редкость: необычная

Примечания. В 99% случаев, если вы создали TableView или CollectionView ранее, вы использовали функцию dequeueReusableCellWithIdentifier. У интервьюеров произойдёт положительное впечатление, если вы сможете объяснить инструменты, которые вы использовали, а не только копирование онлайн-источников.

2. Что такое реактивное программирование?

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

Редкость: Обычный

Примечания: Для крупномасштабного проекта реактивное программирование чрезвычайно полезно. Если вы присоединяетесь к устоявшейся команде разработчиков с крупномасштабным продуктом, они будут задавать этот вопрос большую часть времени.

Практические вопросы

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

  1. Как вы отлаживаете утечки памяти? (зомби, отладчик памяти и т.д.)
  2. Что вы используете для интеграции зависимостей в свой проект? (Cocoapods, Carthage, SPM и т.д.)
  3. Как вы тестируете свой проект? (Юнит-тесты и UI-тесты, какой фреймворк вы используете)
  4. Как запустить фоновую выборку? (как вы обновляете приложение, пока оно не активно, чтобы уменьшить количество обновлений, которые необходимо загрузить, когда пользователь открывает приложение)
  5. Как вы относитесь к push-уведомлениям?
  6. В чем разница между статической и динамической библиотекой?
  7. Что такое процессы View Lifecycle и что они делают? (viewDidLoad, viewDidAppear, viewDidDisappear и т. д.)

Заключение и что дальше

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

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

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

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

Спасибо, что прочитали мою статью! Большое спасибо моим наставникам, mas Yoga и mas Heru за их отзывы и за помощь в доработке этой статьи. Если у вас есть какие-либо вопросы или есть что добавить, не стесняйтесь комментировать их ниже или обращаться ко мне в Linkedin. Любые входы или отзывы приветствуются!

Источники:

https://backlinko.com/iphone-users