Skip to content

Instantly share code, notes, and snippets.

@Soulwest
Last active January 16, 2024 07:51
Show Gist options
  • Save Soulwest/9644fccaeba73ce8cc425c405e250f03 to your computer and use it in GitHub Desktop.
Save Soulwest/9644fccaeba73ce8cc425c405e250f03 to your computer and use it in GitHub Desktop.
IOS interview questions

Links: https://habr.com/en/articles/659169/

https://career.guru99.com/ru/top-18-x-code-interview-questions/

  1. Назовите типы паттернов и расскажите зачем они нужны. https://refactoring.guru/ru/design-patterns/catalog

  2. Расскажите о механизме Copy-on-write На собеседованиях любят тему Copy-on-write, иногда меняется только формулировка вопроса: в одних случаях сотрудники компании спросят определение, в других — попросят привести пример. Copy-on-write — механизм оптимизации в Swift, когда при присвоении переменной значений или при передаче коллекции в функцию не происходит копирование этой коллекции.

  3. Что такое typealias в Swift? typealias является псевдонимом для существующего типа данных. Рассмотрим пример: typealias Dollar = Double Теперь вы можете использовать новый псевдоним Dollar, который по факту является Double: let totalCosts: Dollar Важно заметить, что Dollar не является новым типов, это всего лишь псевдоним.

  4. Что делает init() в Swift? Метод init() используется для инициализации экземпляра.

Инициализация означает подготовку экземпляра (класса, структуры или перечисления) к использованию. В процессе инициализации вы устанавливаете начальные значения для каждого свойства экземпляра. Вы также можете выполнить некоторые другие подготовительные действия, прежде чем экземпляр будет готов к использованию.

  1. В чем разница между структурами и классами? Структуры - это типы значений, в то время как классы - ссылочные типы. Структуры не поддерживают наследование, а классы поддерживают.

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

  1. Объясните архитектуру MVC MVC (Model-View-Controller) - это программная архитектура для разработки приложений для iOS. Это одна из фундаментальных концепций разработки приложений для iOS.

Множество iOS-фреймворков используют MVC. Идея MVC заключается в передаче данных из одного места в другое. Это означает, что любой объект попадает в одну из этих трех категорий: Model: Модель представляет данные приложения. Она хранит информацию, например, товары в магазине. Модель управляет состоянием приложения. View: Вью отвечает за отображение и взаимодействие с пользовательским интерфейсом. Например, вью отображает таблицу товаров для пользователя вашего приложения. Controller: Контроллер - это то, что склеивает модель и представление. Он отвечает за управление логикой, которая происходит между ними.

  1. Что такое дженерики? Приведите пример использования дженериков

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

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

struct Vec3D<T> {
    let x, y, z: T
    init(x: T, y: T, z: T) {
        self.x = x
        self.y = y
        self.z = z
    }
}
let intVector = Vec3D(x: 1, y: 2, z: 5)
let floatVector = Vec3D(x: 1.0, y: 2.0, z: 5.0)
  1. Что такое concurrency, и почему оно важно в разработке iOS-приложений? Concurrency - это одновременное выполнение нескольких задач. Важно для повышения производительности и отзывчивости приложения.

  2. Какие подходы к concurrency существуют в iOS? pThread (не обязательно но +), Grand Central Dispatch (GCD), OperationQueue, Async/await.

  3. Что такое GCD (Grand Central Dispatch), и как его использовать для выполнения задач асинхронно? GCD - это технология для управления параллельными задачами. Используется через dispatch queues.

10.Какие очереди выполнения существуют в Grand Central Dispatch. Main Queue - Выполняется в основном потоке и используется для обновления пользовательского интерфейса. Это последовательная (Serial) очередь. Global - Это системная предоставленная очередь, которая выполняется в фоновом режиме. Это параллельная очередь, и она бывает разных уровней приоритета. Custom - Программист может создавать собственные очереди. Эти очереди могут быть последовательными или параллельными.

11. Как избежать race conditions при работе с разделяемыми данными в многопоточной среде? Использование мьютексов, операций синхронизации, NSLock, GCD.

  1. Какие виды хранения данных существуют в ios? UserDefaults, Core Data, SQLite, Файловая система, Keychain, NSCache

UserDefaults — для хранения пользовательских настроек и флагов. Keychain — для безопасного хранения данных. Property Lists — для хранения конфигурации приложения или его библиотек. Базы данных — для хранения большого объёма различных данных. NSCache — для хранения временных данных. Core Data - представляет собой фреймворк для управления объектным графом данных в приложениях iOS

13. Какие основные компоненты Core Data? Основные компоненты: NSManagedObjectModel, NSPersistentStoreCoordinator, NSManagedObjectContext, NSManagedObject.

14. Как реализовать многопоточность в работе с Core Data? (Бум!!! сразу даст понять знает ли человек Concurrency and Core Data)

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

  1. Какие типы хранилищ поддерживаются Core Data? SQLite, Binary, In-Memory и другие.

  2. Какие потенциальные улучшения вы здесь видите? Вы просматриваете пулл-реквест и столкнулись с этим методом:

func turnTo(direction: String){
    if direction == "North" {
        northAction()
    } else if direction == "East" {
        eastAction()
    } else if direction == "South" {
        southAction()
    } else if direction == "West" {
        westAction()
    } else {
        print("No valid direction specified")
    }
}

Ответ: enum + switch

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment