|
@@ -0,0 +1,200 @@ |
|
|
|
|
|
# Общие |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Жизненный цикл разработки системы / System development lifecycle (SDLC) |
|
|
|
|
|
|
|
|
|
|
|
Фазы: |
|
|
|
|
|
|
|
|
|
|
|
* планирование системы |
|
|
|
|
|
* анализ системы |
|
|
|
|
|
* дизайн системы |
|
|
|
|
|
* разработка, внедрение, развёртывание |
|
|
|
|
|
* опытная эксплуатация и интеграция |
|
|
|
|
|
* поддержка системы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Методологии разработки |
|
|
|
|
|
|
|
|
|
|
|
* Водопад / Waterfall |
|
|
|
|
|
* SCRUM |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Что такое ООП и какие его основные принципы? |
|
|
|
|
|
|
|
|
|
|
|
ООП - это объектно ориентированное программирование. |
|
|
|
|
|
Программа представлена в виде совокупности объектов, |
|
|
|
|
|
каждый из которых является экземпляром класса. |
|
|
|
|
|
|
|
|
|
|
|
* Наследование - это возможность использовать функциональность родительского класса в дочернем |
|
|
|
|
|
* Инкапсуляция - это сокрытие деталей реализации |
|
|
|
|
|
* Полиморфизм - это способность функции работать с данными разных типов |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Шаблоны проектирования |
|
|
|
|
|
|
|
|
|
|
|
Шаблоны проектирования представляют собой архитектурные решения для некоторых |
|
|
|
|
|
часто появляющихся задач. |
|
|
|
|
|
Существуют основные, структурные, поведенческие и пораждающие шаблоны. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Шаблон одиночки (Singleton) |
|
|
|
|
|
|
|
|
|
|
|
Один экземпляр класса, глобальная точка доступа. |
|
|
|
|
|
Хорошо то, что всегда существует, когда используем. |
|
|
|
|
|
Но минус в том, что все использующие его методы прибиты к нему гвоздями, |
|
|
|
|
|
так что протестировать не удастся. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Что такое SOLID? |
|
|
|
|
|
|
|
|
|
|
|
Это пять принципов ООП, предназначенных для создания более ясных, гибких и поддерживаемых систем. |
|
|
|
|
|
|
|
|
|
|
|
* Single responsibility |
|
|
|
|
|
* каждый модуль/класс/функция должны нести ответственность лишь за одну часть функциональности ПО |
|
|
|
|
|
* иначе: у класса должна быть лишь одна причина для изменений |
|
|
|
|
|
* Open-closed |
|
|
|
|
|
* открыто для расширений, закрыто для модификаций |
|
|
|
|
|
* т.е. модули/классы/функции разрешают расширить своё поведение без изменения исходного класса |
|
|
|
|
|
* Liskov substitution |
|
|
|
|
|
* возможность использовать объекты производных классов вместо родительских без нарушения работоспособности |
|
|
|
|
|
* Interface segration |
|
|
|
|
|
* клиент не должен завивесть от неиспользуемых им методов |
|
|
|
|
|
* такие интерфейсы ещё называют ролевыми |
|
|
|
|
|
* Dependency inversion |
|
|
|
|
|
* высоуровневые модули не должны зависеть от низкоуровневых: и те, и другие должны зависить от абстракций |
|
|
|
|
|
* абстракции не должны зависить от деталей (реализации), детали (реализация) должна зависить от абстракций |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## В чём разница между strong и weak? |
|
|
|
|
|
|
|
|
|
|
|
* Strong - это сильная ссылка, weak - слабая. |
|
|
|
|
|
* Сильная ссылка увеличивает счётчик на 1, что не даёт ARC'у очистить используемую память. |
|
|
|
|
|
* Когда ссылка удаляется (вместе с родительским объектом), счётчик уменьшается на 1. |
|
|
|
|
|
* Если счётчик 0, то объект удаляется ARC'ом. |
|
|
|
|
|
* Слабая ссылка никак не влияет на счётчик, поэтому она никак не "удерживает" объект от удаления, на который ссылается. |
|
|
|
|
|
* Чаще всего используется для делегатов. |
|
|
|
|
|
* Ссылки на optional всегда слабые. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Что такое ARC? |
|
|
|
|
|
|
|
|
|
|
|
* Automatic reference counting, автоматический подсчёт ссылок. |
|
|
|
|
|
* Расставляет в коде увеличение/уменьшение счётчика для переменных за программиста. |
|
|
|
|
|
* Не является Garbage Collector. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Что такое optional? |
|
|
|
|
|
|
|
|
|
|
|
* Optional представляет собой две возможности: либо значение есть (его можно "раскрыть"), либо значения нет (nil). |
|
|
|
|
|
* Реализован как enum с наличием значения и его отсутствием, можно написать самостоятельно при желании |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Что такое retain cycle? |
|
|
|
|
|
|
|
|
|
|
|
* Это ситуация, когда два (или более) объекта ссылаются друг на друга сильными ссылками. |
|
|
|
|
|
* Из-за этого ни один из объектов не будет освобождён первым, поэтому получаем циклическую зависимость. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Чем различаются struct и class? |
|
|
|
|
|
|
|
|
|
|
|
* struct - value type, при передаче происходит копия всей структуры |
|
|
|
|
|
* class - reference type, при передаче копия лишь указателя |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Array и Dictionary value type или reference type? |
|
|
|
|
|
|
|
|
|
|
|
Они copy on write, т.е. формально value type, но до изменения они ведут себя как reference type. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Функция ref type или val type? |
|
|
|
|
|
|
|
|
|
|
|
Ref type, capture variables |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Многопотоность |
|
|
|
|
|
|
|
|
|
|
|
Многопоточность - это выполнение нескольких задач одновременно. |
|
|
|
|
|
|
|
|
|
|
|
Существуют следующие механизмы организации многопоточности: |
|
|
|
|
|
|
|
|
|
|
|
* GCD |
|
|
|
|
|
* распределяет нагрузку на уровне системы |
|
|
|
|
|
* Thread |
|
|
|
|
|
* позволяет руками создать отдельный поток |
|
|
|
|
|
* OperationQueue |
|
|
|
|
|
* позволяет поставить одни операции в зависимость от других |
|
|
|
|
|
* чтобы выполнить одни после завершения других |
|
|
|
|
|
* чуть тяжелее GCD |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Какие существуют способы хранить данные локально на устройстве и чем они различаются? |
|
|
|
|
|
|
|
|
|
|
|
* Core Data |
|
|
|
|
|
* является полноценной базой данных |
|
|
|
|
|
* где можно задавать различные связи между объектами и выполнять сложные выборки |
|
|
|
|
|
* User Defaults |
|
|
|
|
|
* хранит все данные в виде ключа-значения, чаще всего используется для хранения настроек приложения |
|
|
|
|
|
* Keychain |
|
|
|
|
|
* предоставляет безопасное шифрованное хранилище для чувствительной информации |
|
|
|
|
|
* Файлы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Каков жизненный цикл UIViewController? |
|
|
|
|
|
|
|
|
|
|
|
* loadView задаёт self.view при создании контролера руками |
|
|
|
|
|
* loadViewIfNeeded задаёт self.view, если к этому моменту self.view ещё отсутствует |
|
|
|
|
|
* viewDidLoad выполняется после задания self.view, границы self.view ещё неизвестны |
|
|
|
|
|
* viewWillAppear выполняется перед показом self.view и добавлением в иерархию отображения, границы заданы, ориентация не задана |
|
|
|
|
|
* viewWillLayoutSubviews выполняется перед раскладкой детей, выполняется при каждом изменении рамки и, например, при загрузке новых ячеек в таблицу |
|
|
|
|
|
* viewDidLayoutSubviews выполняется после раскладки детей, выполняется при каждом изменении рамки и, например, при загрузке новых ячеек в таблицу |
|
|
|
|
|
* viewDidAppear выполняется после отображения self.view и добавления её в иерархию отображения |
|
|
|
|
|
* viewWillDisappear выполняется перед скрытием контролера другим контролером |
|
|
|
|
|
* viewDidDisappear выполняется после скрытия контролера другим контролером |
|
|
|
|
|
* viewWillTransition выполняется при смене ориентации для изменения размера self.view корневого контролера активного окна |
|
|
|
|
|
* этот контролер в свою очередь вызывает этот же метод у дочерних контролеров |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Каков жизненный цикл приложения iOS? |
|
|
|
|
|
|
|
|
|
|
|
* not running |
|
|
|
|
|
* приложение не запущено |
|
|
|
|
|
* inactive |
|
|
|
|
|
* приложение выполняется на переднем плане, но не принимает ввод от пользователя |
|
|
|
|
|
* active |
|
|
|
|
|
* приложение выполняется на переднем плане и принимает ввод от пользователя |
|
|
|
|
|
* background |
|
|
|
|
|
* приложение выполнется в фоне |
|
|
|
|
|
* suspended |
|
|
|
|
|
* приложение в фоне без какого-либо выполнения |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Зачем нужны тесты? |
|
|
|
|
|
|
|
|
|
|
|
Позволяют контролировать качество разрабатываемого ПО |
|
|
|
|
|
и как минимум гарантировать прохождение имеющихся тестов. |
|
|
|
|
|
Покрывать тестами в первую очередь нужно ключевую возможность, |
|
|
|
|
|
предоставляемую приложением, например, заказ такси в приложении заказа такси. |
|
|
|
|
|
|
|
|
|
|
|
Методологии? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|