# Общие ## Жизненный цикл разработки системы / System development lifecycle (SDLC) Фазы: * планирование системы * анализ системы * дизайн системы * разработка, внедрение, развёртывание * опытная эксплуатация и интеграция * поддержка системы ## Методологии разработки * Водопад / Waterfall состоит из следующих шагов: * осуществимость / feasibility * планирование / planning * проектирование / design * создание / build * проверка / test * выпуск / production * поддержка / support * SCRUM ## Что такое ООП и какие его основные принципы? ООП - это объектно ориентированное программирование. Программа представлена в виде совокупности объектов, каждый из которых является экземпляром класса. * Наследование - это возможность использовать функциональность родительского класса в дочернем * Инкапсуляция - это сокрытие деталей реализации * Полиморфизм - это способность функции работать с данными разных типов ## Шаблоны проектирования Шаблоны проектирования представляют собой архитектурные решения для некоторых часто появляющихся задач. Существуют основные, структурные, поведенческие и пораждающие шаблоны. Самые часто используемые в iOS: MVC, Singleton, Delegate, Observer. ## Шаблон одиночки (Singleton) Один экземпляр класса, глобальная точка доступа. Хорошо то, что всегда существует, когда используем. Но минус в том, что все использующие его методы прибиты к нему гвоздями, так что протестировать не удастся. ## Что такое SOLID? Это пять принципов ООП, предназначенных для создания более ясных, гибких и поддерживаемых систем. * Single responsibility * каждый модуль/класс/функция должны нести ответственность лишь за одну часть функциональности ПО * иначе: у класса должна быть лишь одна причина для изменений * Open-closed * открыто для расширений, закрыто для модификаций * т.е. модули/классы/функции разрешают расширить своё поведение без изменения исходного класса * Liskov substitution * возможность использовать объекты производных классов вместо родительских без нарушения работоспособности * Interface segration * клиент не должен завивесть от неиспользуемых им методов * такие интерфейсы ещё называют ролевыми * Dependency inversion * высоуровневые модули не должны зависеть от низкоуровневых: и те, и другие должны зависить от абстракций * абстракции не должны зависить от деталей (реализации), детали (реализация) должна зависить от абстракций ## В чём разница между strong и weak? * Strong - это сильная ссылка, weak - слабая. * Сильная ссылка увеличивает счётчик на 1, что не даёт ARC'у очистить используемую память. * Когда ссылка удаляется (вместе с родительским объектом), счётчик уменьшается на 1. * Если счётчик 0, то объект удаляется ARC'ом. * Слабая ссылка никак не влияет на счётчик, поэтому она никак не "удерживает" объект от удаления, на который ссылается. * Чаще всего используется для делегатов. ## Что такое ARC? * Automatic reference counting, автоматический подсчёт ссылок. * Расставляет в коде увеличение/уменьшение счётчика для переменных за программиста. * Не является Garbage Collector. * ARC не обрабатывает случаи retain cycle автоматически, как это делают GC. ## Что такое optional? * Optional представляет собой две возможности: либо значение есть (его можно "раскрыть"), либо значения нет (nil). * Реализован как enum с наличием значения и его отсутствием, можно написать самостоятельно при желании ## Что такое retain cycle? * Это ситуация, когда два (или более) объекта ссылаются друг на друга сильными ссылками. * Из-за этого ни один из объектов не будет освобождён первым, поэтому получаем циклическую зависимость. ## Контроль доступа * open * открытые классы могут наследоваться и в опредляющем их модуле, и вовне * открытые члены класса можно переопределить и в определюящем их модуле, и вовне * использовать можно где угодно * public * публичные классы могут наследоваться лишь в определяющем их модуле * публичные члены класса можно переопределить лишь в определяющеим их модуле * использовать можно где угодно * internal * использовать можно лишь внутри определяющего модуля * fileprivate * использовать можно лишь внутри этого файла * private * использовать можно лишь в пределах области реализации ## Чем различаются 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 * приложение в фоне без какого-либо выполнения ## Зачем нужны тесты? Позволяют контролировать качество разрабатываемого ПО и как минимум гарантировать прохождение имеющихся тестов. Покрывать тестами в первую очередь нужно ключевую возможность, предоставляемую приложением, например, заказ такси в приложении заказа такси. Методологии: * TDD * BDD * Fakes: часто включают в себя stubs, mocks. а воообще сами по себе просто пустышки без наполнения * Stubs: пустышки с наполнением, чтобы лишь провести тесты * Mocks: пустышки с наполнением и внутренними счётчиками, по которым можно проверить клиента ## RunLoop https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16 Это цикл обработки событий, используемый для планирования работы и координирования принятия входящих событий. Целью RunLoop является поддержание потоков в работе, когда есть работа, либо укладывание потоков спать, если работы нет. У каждого потока есть ассоциированный с ним RunLoop. ## Functional reactive programming Декларативная парадигма программирования, объединяющая в себе функциональное программирование и реактивную (асинхронный потоки) парадигму. В FRP мы описываем, что мы хотим сделать, а не как. ## Можно ли протоколы расширять? Можно, например, в extension делать реализацию по умолчанию? К тому же можно делать optional protocol functions с помощью @objc optional