Главное меню » Начинающим » Для Собеседования » Вопросы и ответы на собеседование iOS разработчика (часть 1)

Вопросы и ответы на собеседование iOS разработчика (часть 1)

Итак, пришло время опубликовать очередную порцию вопросов и ответов для собеседований, которые будут полезны как начинающим, так и опытным iOS-разработчикам.

Вопрос 1: Что такое полиморфизм?

Ответ: Полиморфизм — это базовый принцип ООП. Суть заключается в том, что один и тотже метод разных наследников имеет собственную реализацию.
Если говорить кратко, полиморфизм — это способность обьекта использовать методы производного класса, который не существует на момент создания базового. Для тех, кто не особо сведущ в ООП, это, наверно, звучит сложно. Поэтому рассмотрим применение полиморфизма на примере.
Определение полиморфизма как «один интерфейс — много реализаций», популяризованное Бьерном Страуструпом, относится к ad hoc полиморфизму, но в действительности, ad hoc полиморфизм не является истинным полиморфизмом
Полиморфизмом назвается возможность работать с несколькими типами так, как будто это один и тот же тип и в то же время поведение каждого типа будет уникальным в зависимости от его реализации.
Полиморфизм может быть:

  • Статическим
  • Динамический
  • Параметрический

Классическим примером полиморфного типа служит список элементов произвольного типа.
Статьи по теме:
https://ru.wikipedia.org/wiki/Полиморфизм_(информатика)
Полиморфизм для начинающих

Вопрос 2: Что такое инкапсуляция? Что такое нарушение инкапсуляции?

Ответ: Инкапсуляция (англ. encapsulation) это фундаментальная объектно-ориентированная концепция, позволяющая упаковывать данные и поведение в единый компонент с разделением его на обособленные части — интерфейс и реализацию.
Еще вариант определения:

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

Говоря проще: мы скрываем реализацию от пользователя, предоставляя ему интерфейс. Как класс или метод реализован на самом деле — пользователю знать не обязательно.

Вопрос 3: Чем абстрактный класс отличается от интерфейса?

Ответ: Абстрактный класс — это класс, у которого не реализован один или больше методов (некоторые языки требуют такие методы помечать специальными ключевыми словами).
Интерфейс — это абстрактный класс, у которого все методы не реализованы, все публичные и нет переменных класса.
Интерфейс нужен обычно, когда описывается только интерфейс. Например, один класс хочет дать другому возможность доступа к некоторым своим методам, но не хочет себя «раскрывать». Поэтому он просто реализует интерфейс.
Абстрактный класс нужен, когда нужно семейство классов, у которых есть много общего. Конечно, можно применить и интерфейс, но тогда нужно будет писать много идентичного кода.
В некоторых языках (С++) специального ключевого слова для обозначения интерфейсов нет. Можно считать, что любой интерфейс — это уже абстрактный класс, но не наоборот.

Вопрос 4: Расскажите о паттерне MVC. Чем отличается пассивная модель от активной?

Ответ: Model-view-controller (MVC, «модель-представление-контроллер», «модель-вид-контроллер») — схема использования нескольких шаблонов проектирования, с помощью которых модель приложения, пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные. Такой паттерн проектирования часто используется для построения архитектурного каркаса, когда переходят от теории к реализации в конкретной предметной области.
В оригинальной концепции была описана сама идея и роль каждого из элементов: модели, представления и контроллера. Но связи между ними были описаны без конкретизации. Кроме того, различали две основные модификации:

  • Пассивная модель — модель не имеет никаких способов воздействовать на представление или контроллер, и используется ими в качестве источника данных для отображения. Все изменения модели отслеживаются контроллером и он же отвечает за перерисовку представления, если это необходимо. Такая модель чаще используется в структурном программировании, так как в этом случае модель представляет просто структуру данных, без методов их обрабатывающих;
  • Активная модель — модель оповещает о произошедших в ней изменениях те представления, которые подписались на получение таких оповещений. Это позволяет сохранить независимость модели от контроллеров и представлений.
Вопрос 5: Реализация синглтона в ARC и в non-ARC?

Ответ: В случае использования ARC:

Без использования ARC:
AppUtils.h

AppUtils.m

Вопрос 6: Какие еще паттерны проектирования вы знаете?

Ответ:
Порождающие паттерны, паттерны создания объектов (Creational):

Структурные паттерны (Structural):

Патерны поведения и взаимодействия объектов (Behavioral):

Вопрос 7: Что такое responder chain?

Ответ: Для обработки взаимодействия пользователя с UI и внешних событий в iOS используется механизм Responder Chain
Для touch-событий:

  • Объект типа UIWindows пытается передать touch в объект типа UIView, в котором он был вызван (hit-testing)
  • Если UIView не может обработать данный touch (например, объект в данный момент невидим, или отключил возможность взаимодействия с собой), touch передается в superview данного компонента, и так далее вверх, пока он не будет обработан

Класс UIApplication, UIViewController и UIView наследуются от класса UIResponder.
Класс UIResponder определяет порядок, в котором объекты обрабатывают события (touch-события, события от элементов UI (кнопки и т.д.), изменение текста). Кроме того, UIResponder объявляет методы, которые позволяют объектам определять, кто первым будет отвечать и обрабатывать сообщения:

  • becomeFirstResponder — объект-получатель сообщения будет первым получать все события, посылаемые системой
  • resignFirstResponder — объект-получатель отказывается от обработки сообщений первым

Документация от Apple.

Вопрос 8: Как работают push-уведомления?

Ответ: Push-уведомление — это короткое сообщение, состоящее из токена девайса, полезной нагрузки (payload) и ещё некоторой информации. Полезная нагрузка — это актуальные данные, которые будут отправляться на девайс. Схема работы выглядит следующим образом:

  1. Apple Push Notification Service (APNS) запрашивает у устройства token, своеобразный ключ, который можно считать «адресом».
  2. Есть сервер (наш или иной сервис).
  3. Приложение отправляет token на сервер, коткорый занимается отправкой push-уведомлений.
  4. Когда произойдёт какое-либо событие для вашего приложения, сервер отправит push-уведомление в APNS.
  5. APNS отправит push-уведомление на девайс пользователя.

Для разработки push-уведомлений, надо учитывать следующие моменты:

  • iPhone, iPad или iPod touch. Push-уведомления не работают в симуляторе, поэтому для тестирования нужен настоящий девайс.
  • Регистрация в iOS Developer Program. Для каждого приложения, в котором будет интегрирован механизм push-уведомлений, необходимо создать новый App ID и provisioning profile, а также SSL-сертификат для сервера. Эти действия выполняются на iOS Provisioning Portal.
  • Необходимо создать provisioning profile и SSL-сертификат.
  • Сервер, подключенный к интернету. Push-уведомления всегда отправляются сервером.

Push-уведомления — это нечто довольно маленькое; размер полезной нагрузки не может превышать 256 байт. Это примерно столько же, сколько позволяет вместить в себя СМС или твит. Push-сервер не будет тратиться на переносы на новую строку и пробелы.
Тонкие моменты при работе с push-уведомлениями:

  • Они не надёжны! Нет гарантий, что push-уведомления будут доставлены, даже если APNS примет их.
  • Как только ваш сервер сформировал push-уведомление, он безответно отправляет его в APNS. Нет способа узнать статус доставки уведомления конечному пользователю после отправки. Время доставки может варьироваться от нескольких секунд до получаса.
  • Кроме этого, у пользователей i-девайсов может не быть возможности получать push-уведомления всё время. Например, рядом нет Wi-Fi сети с доступом в интернет либо девайс может быть вообще выключен.
  • APNS будет пытаться доставить последнее отправленное уведомление, когда девайс станет доступен для приёма. Но эти попытки ограничены по времени. После тайм-аута push-уведомление будет потеряно навсегда!
  • Они могут быть дорогими! Добавить push-функционал в приложение довольно просто и недорого, если вы владеете данными. Однако если у вас много пользователей либо необходимо запрашивать данные, то затраты резко возрастают.
Вопрос 9: Что такое SOLID принципы?

S — Single responsibility principle — Принцип единственной обязанности:
На каждый класс должна быть возложена одна-единственная обязанность.

O — Open/closed principle — Принцип открытости/закрытости:
Программные сущности должны быть открыты для расширения, но закрыты для изменения.

L — Liskov substitution principle — Принцип подстановки Барбары Лисков:
Функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа, не зная об этом.

I — Interface segregation principle — Принцип разделения интерфейса
Много специализированных интерфейсов лучше, чем один универсальный.

D — Dependency inversion principle — Принцип инверсии зависимостей:
Зависимости внутри системы строятся на основе абстракций. Модули верхнего уровня не зависят от модулей нижнего уровня. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Еще почитать по теме:
От STUPID кода к SOLID коду
Шпаргалка по SOLID принципам

Вопрос 10: Цикл жизни ios-приложения

Ответ: Состояния приложения

Состояние Описание
Not running Приложение не запущено или было запущено, но его выполнение было прервано системой
Inactive Приложение запущено на переднем плане, но в данный момент не принимает события. (Хотя может выполнять в этот момент какой-то другой код). Приложение обычно остается в этом состоянии очень ненадолго, поскольку оно сразу переходит в другое состояние.
Active Приложение работает на переднем плане и принимает события. Это обычный режим для приложений на переднем плане.
Background Приложение находится в фоновом режиме и выполняет код. Большинство приложений вводят это состояние ненадолго, во время перехода к состоянию suspended. Однако приложение, запрашивающее дополнительное время выполнения, может оставаться в этом состоянии еще некоторое время. Кроме того, приложение, запускаемое непосредственно в фоновом режиме, сразу входит в состояние Background, а не в состояние Inactive.
Suspended Приложение находится в фоновом режиме, но не выполняет код. Система автоматически переводит приложения в это состояние и не уведомляет их об этом. Приложение приостановлено, оно остается в памяти, однако не выполняет никакого кода. При возникновении состояния с нехваткой памятью система может удалять приостановленные приложения без уведомления, чтобы освободить место для приложений переднего плана.