You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

14KB

Общие

Жизненный цикл разработки системы / 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