Что такое асинхронная задача ?
Спросят с вероятностью 45%
Асинхронная задача — это операция, которая выполняется параллельно с основным потоком выполнения программы, не блокируя его. Это означает, что программа может продолжать обрабатывать другие задачи, не дожидаясь завершения асинхронной операции. Часто используется для операций, которые могут занимать значительное время, таких как сетевые запросы, чтение или запись файлов, обработка больших объёмов данных и длительные вычислительные операции.
Принцип работы
Когда вы запускаете асинхронную задачу, программа не останавливает своё выполнение до того момента, как задача будет завершена. Вместо этого, задача выполняется в фоновом режиме, и программа может продолжать выполняться нормально. Как только асинхронная задача завершается, программа может получить результат её выполнения и, при необходимости, обработать его. Это особенно важно для пользовательских интерфейсов, где блокировка основного потока может привести к "замерзанию" интерфейса и ухудшению восприятия программы пользователем.
Для работы с асинхронными задачами часто используются замыкания (closures) и различные API, такие как Grand Central Dispatch (GCD) и
В этом примере функция
Асинхронная задача позволяет выполнять длительные операции в фоновом режиме, не блокируя основной поток программы. Это делает приложения более отзывчивыми и улучшает пользовательский опыт, особенно в сценариях, требующих выполнения тяжёлых или длительных операций, таких как сетевые запросы или обработка данных.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 45%
Асинхронная задача — это операция, которая выполняется параллельно с основным потоком выполнения программы, не блокируя его. Это означает, что программа может продолжать обрабатывать другие задачи, не дожидаясь завершения асинхронной операции. Часто используется для операций, которые могут занимать значительное время, таких как сетевые запросы, чтение или запись файлов, обработка больших объёмов данных и длительные вычислительные операции.
Принцип работы
Когда вы запускаете асинхронную задачу, программа не останавливает своё выполнение до того момента, как задача будет завершена. Вместо этого, задача выполняется в фоновом режиме, и программа может продолжать выполняться нормально. Как только асинхронная задача завершается, программа может получить результат её выполнения и, при необходимости, обработать его. Это особенно важно для пользовательских интерфейсов, где блокировка основного потока может привести к "замерзанию" интерфейса и ухудшению восприятия программы пользователем.
Для работы с асинхронными задачами часто используются замыкания (closures) и различные API, такие как Grand Central Dispatch (GCD) и
async/await. Вот пример использования async/await для асинхронной загрузки данных из сети:func fetchDataAsync() async -> Data? {
let url = URL(string: "https://example.com/data")!
do {
let (data, _) = try await URLSession.shared.data(from: url)
return data
} catch {
print("Ошибка при загрузке данных: \(error)")
return nil
}
}
// Где-то в другом месте вашего кода
Task {
if let data = await fetchDataAsync() {
// Обработка данных
}
}В этом примере функция
fetchDataAsync выполняет асинхронный запрос к серверу и возвращает данные, полученные в ответ. Благодаря использованию async/await, код остаётся читаемым и легко понимаемым, несмотря на асинхронность операции.Асинхронная задача позволяет выполнять длительные операции в фоновом режиме, не блокируя основной поток программы. Это делает приложения более отзывчивыми и улучшает пользовательский опыт, особенно в сценариях, требующих выполнения тяжёлых или длительных операций, таких как сетевые запросы или обработка данных.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Какое ключевое слово используется для объявления константы в Swift?
Anonymous Quiz
3%
const
95%
let
1%
var
1%
constant
Можно ли совершить реализацию функции в протоколе ?
Спросят с вероятностью 18%
Можно реализовать функцию в протоколе, используя расширения протоколов (protocol extensions). Этот подход позволяет добавлять конкретную реализацию методов, свойств и других требований протокола, что делает протоколы очень мощным инструментом для создания гибкого и масштабируемого кода.
Как это работает
Расширения протоколов позволяют определять реализацию методов, свойств, инициализаторов и сабскриптов, которые будут доступны всем типам, соответствующим данному протоколу. Таким образом, любой тип данных, который принимает этот протокол, автоматически наследует эту реализацию без необходимости повторного её написания.
Пример:
В этом примере, структура
Преимущества:
1️⃣Код становится более DRY (Don't Repeat Yourself): Расширения протоколов позволяют определить общее поведение в одном месте, а не дублировать код во всех типах, соответствующих протоколу.
2️⃣Повышение гибкости: Можно легко изменять поведение всех типов, соответствующих протоколу, просто изменяя реализацию в расширении протокола.
3️⃣Улучшение тестируемости: Благодаря тому что конкретные реализации сосредоточены в расширениях протоколов, их легче тестировать и поддерживать.
Ограничения:
✅Расширения не могут добавлять хранимые свойства к типам.
✅Расширения не могут переопределить существующие методы, реализованные типами.
Расширения протоколов делают Swift более мощным языком для разработки, обеспечивая гибкость и повторное использование кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Можно реализовать функцию в протоколе, используя расширения протоколов (protocol extensions). Этот подход позволяет добавлять конкретную реализацию методов, свойств и других требований протокола, что делает протоколы очень мощным инструментом для создания гибкого и масштабируемого кода.
Как это работает
Расширения протоколов позволяют определять реализацию методов, свойств, инициализаторов и сабскриптов, которые будут доступны всем типам, соответствующим данному протоколу. Таким образом, любой тип данных, который принимает этот протокол, автоматически наследует эту реализацию без необходимости повторного её написания.
Пример:
protocol Printable {
func printYourself()
}
extension Printable {
func printYourself() {
print("I am \(self)")
}
}
struct Person: Printable {
var name: String
var age: Int
}
let john = Person(name: "John Doe", age: 30)
john.printYourself() // Вывод: "I am Person(name: "John Doe", age: 30)"В этом примере, структура
Person соответствует протоколу Printable и автоматически получает реализацию метода printYourself через расширение протокола. Метод выводит строковое представление экземпляра.Преимущества:
1️⃣Код становится более DRY (Don't Repeat Yourself): Расширения протоколов позволяют определить общее поведение в одном месте, а не дублировать код во всех типах, соответствующих протоколу.
2️⃣Повышение гибкости: Можно легко изменять поведение всех типов, соответствующих протоколу, просто изменяя реализацию в расширении протокола.
3️⃣Улучшение тестируемости: Благодаря тому что конкретные реализации сосредоточены в расширениях протоколов, их легче тестировать и поддерживать.
Ограничения:
✅Расширения не могут добавлять хранимые свойства к типам.
✅Расширения не могут переопределить существующие методы, реализованные типами.
Расширения протоколов делают Swift более мощным языком для разработки, обеспечивая гибкость и повторное использование кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤1
Anonymous Quiz
63%
Атрибут, позволяющий классу вызываться как функция.
4%
Атрибут для создания массивов.
6%
Атрибут для обработки ошибок.
26%
Атрибут для управления памятью.
🤔6❤2
Какие отличия MVC от MVP ?
Спросят с вероятностью 18%
MVC (Model-View-Controller) и MVP (Model-View-Presenter) — это два популярных архитектурных паттерна, используемых для создания веб- и настольных приложений. Оба паттерна предназначены для разделения ответственности между компонентами программы, что упрощает управление кодом, его тестирование и поддержку. Вот ключевые отличия между ними:
MVC (Model-View-Controller)
Компоненты:
✅Model: Содержит бизнес-логику и данные. Оповещает контроллер о изменениях, которые нужно отразить в представлении.
✅View: Отображает данные (модель) пользователю и отправляет действия пользователя контроллеру.
✅Controller: Мост между моделью и представлением. Обрабатывает входящие действия и данные от представления, изменяет модель и обновляет представление.
Особенности:
✅Представление обновляется напрямую моделью, но в более современных интерпретациях (часто веб-фреймворки) контроллер отвечает за обновление представления.
✅Контроллер связывает модель и представление, обрабатывая логику на основе действий пользователя.
MVP (Model-View-Presenter)
Компоненты:
✅Model: Также содержит бизнес-логику и данные приложения.
✅View: Интерфейс, который отображает данные (модель) и делегирует все действия пользователя через интерфейс на Presenter.
✅Presenter: Получает действия от представления через интерфейс, работает с моделью и обновляет представление. Представление пассивно — оно не содержит никакой логики, кроме логики отображения.
Особенности:
✅Presenter в MVP не знает о конкретных реализациях представлений. Он работает через абстрактный интерфейс View, что упрощает тестирование.
✅Представление в MVP полностью пассивно, что значит, что вся логика управления UI переносится в Presenter. Это упрощает модульное тестирование, так как Presenter можно тестировать отдельно от пользовательского интерфейса.
Ключевые отличия:
✅Связь между компонентами: В MVC контроллер активно связывает модель и представление, в то время как в MVP Presenter обеспечивает двустороннюю связь между моделью и представлением через абстрактный интерфейс.
✅Роль View: В MVC представление может быть более активным участником (особенно в веб-разработке), принимая решения на основе данных модели. В MVP представление полностью пассивно и все решения по управлению данными и состоянием UI принимаются Presenter'ом.
✅Тестируемость: MVP часто считается более удобным для модульного тестирования, поскольку Presenter не зависит от конкретных реализаций View и может быть легко протестирован с моками или стабами представления.
Оба паттерна полезны и могут быть использованы в различных сценариях в зависимости от конкретных требований проекта и предпочтений команды.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
MVC (Model-View-Controller) и MVP (Model-View-Presenter) — это два популярных архитектурных паттерна, используемых для создания веб- и настольных приложений. Оба паттерна предназначены для разделения ответственности между компонентами программы, что упрощает управление кодом, его тестирование и поддержку. Вот ключевые отличия между ними:
MVC (Model-View-Controller)
Компоненты:
✅Model: Содержит бизнес-логику и данные. Оповещает контроллер о изменениях, которые нужно отразить в представлении.
✅View: Отображает данные (модель) пользователю и отправляет действия пользователя контроллеру.
✅Controller: Мост между моделью и представлением. Обрабатывает входящие действия и данные от представления, изменяет модель и обновляет представление.
Особенности:
✅Представление обновляется напрямую моделью, но в более современных интерпретациях (часто веб-фреймворки) контроллер отвечает за обновление представления.
✅Контроллер связывает модель и представление, обрабатывая логику на основе действий пользователя.
MVP (Model-View-Presenter)
Компоненты:
✅Model: Также содержит бизнес-логику и данные приложения.
✅View: Интерфейс, который отображает данные (модель) и делегирует все действия пользователя через интерфейс на Presenter.
✅Presenter: Получает действия от представления через интерфейс, работает с моделью и обновляет представление. Представление пассивно — оно не содержит никакой логики, кроме логики отображения.
Особенности:
✅Presenter в MVP не знает о конкретных реализациях представлений. Он работает через абстрактный интерфейс View, что упрощает тестирование.
✅Представление в MVP полностью пассивно, что значит, что вся логика управления UI переносится в Presenter. Это упрощает модульное тестирование, так как Presenter можно тестировать отдельно от пользовательского интерфейса.
Ключевые отличия:
✅Связь между компонентами: В MVC контроллер активно связывает модель и представление, в то время как в MVP Presenter обеспечивает двустороннюю связь между моделью и представлением через абстрактный интерфейс.
✅Роль View: В MVC представление может быть более активным участником (особенно в веб-разработке), принимая решения на основе данных модели. В MVP представление полностью пассивно и все решения по управлению данными и состоянием UI принимаются Presenter'ом.
✅Тестируемость: MVP часто считается более удобным для модульного тестирования, поскольку Presenter не зависит от конкретных реализаций View и может быть легко протестирован с моками или стабами представления.
Оба паттерна полезны и могут быть использованы в различных сценариях в зависимости от конкретных требований проекта и предпочтений команды.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤2🔥2
Что такое диспетчеризация ?
Спросят с вероятностью 45%
Диспетчеризация (dispatch) относится к процессу определения того, какой блок кода (или функция) должен быть выполнен в ответ на вызов функции, особенно когда точный метод, который следует вызвать, не может быть определён на момент компиляции. Этот процесс тесно связан с концепцией полиморфизма и механизмами наследования в объектно-ориентированном программировании. Существует несколько ее типов.
Статическая диспетчеризация
Происходит, когда вызываемый метод или функция определяются на этапе компиляции. Это самый быстрый способ диспетчеризации, поскольку компилятор заранее знает, какой именно метод должен быть вызван, и может оптимизировать вызов. Статическая диспетчеризация часто используется в языках программирования со строгой типизацией и в сценариях, где полиморфизм не требуется или его можно эмулировать через другие средства, например, через шаблоны в C++ или дженерики в Swift и Java.
Динамическая диспетчеризация
Используется в ситуациях, когда точный метод для вызова определяется во время выполнения программы. Это типично для ситуаций с полиморфными вызовами в объектно-ориентированном программировании, когда, например, метод подкласса переопределяет метод базового класса. Динамическая диспетчеризация позволяет более гибко работать с кодом, но может привести к некоторому снижению производительности по сравнению со статической диспетчеризацией из-за необходимости определения вызываемого метода в рантайме.
Множественная диспетчеризация
Это форма диспетчеризации, которая позволяет выбирать метод на основе типа нескольких аргументов. Это менее распространённый механизм, но он может быть очень мощным в языках, которые его поддерживают, таких как Julia, позволяя писать очень обобщённый и в то же время эффективный код.
Swift использует как статическую, так и динамическую диспетчеризацию, в зависимости от контекста. Методы структур и перечислений обычно используют статическую диспетчеризацию, что делает их вызов очень быстрым. В то же время, методы классов могут использовать динамическую диспетчеризацию, особенно если они помечены как
Диспетчеризация — это процесс определения, какой метод или функция должны быть вызваны в ответ на вызов. Статическая диспетчеризация происходит на этапе компиляции и обеспечивает высокую производительность, в то время как динамическая диспетчеризация происходит во время выполнения и обеспечивает большую гибкость за счет потенциального снижения скорости выполнения.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 45%
Диспетчеризация (dispatch) относится к процессу определения того, какой блок кода (или функция) должен быть выполнен в ответ на вызов функции, особенно когда точный метод, который следует вызвать, не может быть определён на момент компиляции. Этот процесс тесно связан с концепцией полиморфизма и механизмами наследования в объектно-ориентированном программировании. Существует несколько ее типов.
Статическая диспетчеризация
Происходит, когда вызываемый метод или функция определяются на этапе компиляции. Это самый быстрый способ диспетчеризации, поскольку компилятор заранее знает, какой именно метод должен быть вызван, и может оптимизировать вызов. Статическая диспетчеризация часто используется в языках программирования со строгой типизацией и в сценариях, где полиморфизм не требуется или его можно эмулировать через другие средства, например, через шаблоны в C++ или дженерики в Swift и Java.
Динамическая диспетчеризация
Используется в ситуациях, когда точный метод для вызова определяется во время выполнения программы. Это типично для ситуаций с полиморфными вызовами в объектно-ориентированном программировании, когда, например, метод подкласса переопределяет метод базового класса. Динамическая диспетчеризация позволяет более гибко работать с кодом, но может привести к некоторому снижению производительности по сравнению со статической диспетчеризацией из-за необходимости определения вызываемого метода в рантайме.
Множественная диспетчеризация
Это форма диспетчеризации, которая позволяет выбирать метод на основе типа нескольких аргументов. Это менее распространённый механизм, но он может быть очень мощным в языках, которые его поддерживают, таких как Julia, позволяя писать очень обобщённый и в то же время эффективный код.
Swift использует как статическую, так и динамическую диспетчеризацию, в зависимости от контекста. Методы структур и перечислений обычно используют статическую диспетчеризацию, что делает их вызов очень быстрым. В то же время, методы классов могут использовать динамическую диспетчеризацию, особенно если они помечены как
dynamic или происходят от классов, отмеченных @objc, для совместимости с Objective-C.Диспетчеризация — это процесс определения, какой метод или функция должны быть вызваны в ответ на вызов. Статическая диспетчеризация происходит на этапе компиляции и обеспечивает высокую производительность, в то время как динамическая диспетчеризация происходит во время выполнения и обеспечивает большую гибкость за счет потенциального снижения скорости выполнения.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍4❤1👾1
Как будут реализованы опциональные функции в протоколах ?
Спросят с вероятностью 18%
Для реализации опциональных функций в протоколах существуют несколько подходов. Первый подход, который уже был описан ранее, использует
Реализация:
1️⃣Расширения протоколов
Методы в протоколах могут иметь реализацию по умолчанию с помощью расширений. Это позволяет объектам, подписанным под протокол, не реализовывать эти методы, так как уже существует базовая реализация.
2️⃣Использование пустых реализаций
Можно определить методы в протоколе как требуемые, но предоставить пустую реализацию в расширении протокола. Это дает возможность типам не предоставлять собственные реализации.
Особенности:
✅Расширение протоколов удобно, если метод может иметь смысловую реализацию по умолчанию, которая будет полезна для всех или большинства реализующих типов.
✅Пустые реализации полезны, когда наличие метода в типе не обязательно, и его выполнение не требует действий по умолчанию.
Эти методы позволяют избежать зависимости от Objective-C, поддерживая при этом чистый и безопасный код. Это делает ваш код более модульным, упрощает его тестирование и сопровождение.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Для реализации опциональных функций в протоколах существуют несколько подходов. Первый подход, который уже был описан ранее, использует
@objc атрибут и опциональные члены, доступные только для классов и только в контексте Objective-C совместимости. Однако, помимо этого подхода, можно использовать несколько других техник для достижения похожего результата, без использования @objc.Реализация:
1️⃣Расширения протоколов
Методы в протоколах могут иметь реализацию по умолчанию с помощью расширений. Это позволяет объектам, подписанным под протокол, не реализовывать эти методы, так как уже существует базовая реализация.
protocol MyProtocol {
func requiredMethod()
func optionalMethod()
}
extension MyProtocol {
func optionalMethod() {
print("Default implementation of optionalMethod")
}
}
class MyClass: MyProtocol {
func requiredMethod() {
print("Implementation of requiredMethod")
}
}
let instance = MyClass()
instance.requiredMethod() // Вывод: "Implementation of requiredMethod"
instance.optionalMethod() // Вывод: "Default implementation of optionalMethod"2️⃣Использование пустых реализаций
Можно определить методы в протоколе как требуемые, но предоставить пустую реализацию в расширении протокола. Это дает возможность типам не предоставлять собственные реализации.
protocol MyProtocol {
func requiredMethod()
func optionalMethod()
}
extension MyProtocol {
func optionalMethod() {}
}
class MyClass: MyProtocol {
func requiredMethod() {
print("Implementation of requiredMethod")
}
}
let instance = MyClass()
instance.requiredMethod() // Вывод: "Implementation of requiredMethod"
instance.optionalMethod() // Ничего не выводитсяОсобенности:
✅Расширение протоколов удобно, если метод может иметь смысловую реализацию по умолчанию, которая будет полезна для всех или большинства реализующих типов.
✅Пустые реализации полезны, когда наличие метода в типе не обязательно, и его выполнение не требует действий по умолчанию.
Эти методы позволяют избежать зависимости от Objective-C, поддерживая при этом чистый и безопасный код. Это делает ваш код более модульным, упрощает его тестирование и сопровождение.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍1
Anonymous Quiz
16%
isEqualTo()
13%
equals()
65%
==
5%
compare()
👍1
Могут ли быть в протоколах опциональные функции ?
Спросят с вероятностью 18%
Протоколы могут содержать опциональные функции, но для этого требуется использование
Особенности:
1️⃣Использование `@objc`: Протокол должен быть объявлен с атрибутом
2️⃣Ограничение на типы: Только классы могут реализовывать такие протоколы с опциональными функциями, так как
3️⃣Синтаксис: Опциональные методы в протоколе должны быть явно помечены как
В этом примере
Альтернативы:
Если вы хотите избежать использования
✅Расширения протоколов: Вы можете определить реализацию по умолчанию для методов протокола в расширении. Это не делает методы опциональными в том смысле, что они могут отсутствовать, но позволяет типам не предоставлять собственные реализации этих методов.
✅Предоставление пустой реализации: Это похоже на расширение протоколов, но вы можете явно указать, что некоторые методы могут не делать ничего, предоставив пустую реализацию в классе, который принимает протокол.
Эти методы позволяют достичь похожей гибкости без необходимости совместимости с Objective-C.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Протоколы могут содержать опциональные функции, но для этого требуется использование
@objc атрибута. Этот атрибут указывает, что протокол и его опциональные члены должны быть доступны в Objective-C, что добавляет некоторые ограничения.Особенности:
1️⃣Использование `@objc`: Протокол должен быть объявлен с атрибутом
@objc для того, чтобы поддерживать опциональные члены. Это делает протокол совместимым с Objective-C.2️⃣Ограничение на типы: Только классы могут реализовывать такие протоколы с опциональными функциями, так как
@objc протоколы не могут быть приняты структурами или перечислениями.3️⃣Синтаксис: Опциональные методы в протоколе должны быть явно помечены как
optional.import Foundation
@objc protocol MyProtocol {
@objc optional func optionalMethod()
func requiredMethod()
}
class MyClass: MyProtocol {
func requiredMethod() {
print("Реализация обязательного метода")
}
func optionalMethod() {
print("Реализация опционального метода")
}
}
class MySecondClass: MyProtocol {
func requiredMethod() {
print("Реализация обязательного метода во втором классе")
}
// Опциональный метод не реализован
}
let myObject = MyClass()
myObject.optionalMethod?() // Вывод: "Реализация опционального метода"
myObject.requiredMethod() // Вывод: "Реализация обязательного метода"
let mySecondObject = MySecondClass()
mySecondObject.optionalMethod?() // Ничего не происходит, метод не вызывается
mySecondObject.requiredMethod() // Вывод: "Реализация обязательного метода во втором классе"
В этом примере
MyClass реализует как опциональный, так и обязательный методы, тогда как MySecondClass реализует только обязательный метод. Вызов optionalMethod происходит с использованием синтаксиса опционального вызова (?()), что безопасно, даже если метод не реализован.Альтернативы:
Если вы хотите избежать использования
@objc и Objective-C совместимости, вы можете рассмотреть другие подходы, такие как:✅Расширения протоколов: Вы можете определить реализацию по умолчанию для методов протокола в расширении. Это не делает методы опциональными в том смысле, что они могут отсутствовать, но позволяет типам не предоставлять собственные реализации этих методов.
✅Предоставление пустой реализации: Это похоже на расширение протоколов, но вы можете явно указать, что некоторые методы могут не делать ничего, предоставив пустую реализацию в классе, который принимает протокол.
Эти методы позволяют достичь похожей гибкости без необходимости совместимости с Objective-C.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍4
Что используется для многопоточности в IOS ?
Спросят с вероятностью 27%
Для реализации многопоточности используются различные технологии и фреймворки, позволяющие эффективно управлять параллельным выполнением задач. Вот некоторые из них:
1️⃣Grand Central Dispatch (GCD)
Это низкоуровневый API для многозадачности, основанный на очередях. GCD позволяет выполнять задачи асинхронно или синхронно в различных очередях. Очереди могут быть последовательными (serial) или параллельными (concurrent). GCD автоматически управляет пулом потоков, что упрощает работу с многопоточностью.
2️⃣Operation и OperationQueue
Это абстрактный класс, который представляет собой одиночную задачу. Задачи, представленные операциями (
3️⃣async/await (Swift 5.5 и выше)
async/await упрощает асинхронное программирование, делая асинхронный код более читабельным и похожим на синхронный. Это существенно упрощает работу с асинхронными операциями, такими как сетевые запросы или долгие вычисления, и обеспечивает более безопасное и удобное управление потоками.
Для реализации многопоточности применяются Grand Central Dispatch (GCD),
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 27%
Для реализации многопоточности используются различные технологии и фреймворки, позволяющие эффективно управлять параллельным выполнением задач. Вот некоторые из них:
1️⃣Grand Central Dispatch (GCD)
Это низкоуровневый API для многозадачности, основанный на очередях. GCD позволяет выполнять задачи асинхронно или синхронно в различных очередях. Очереди могут быть последовательными (serial) или параллельными (concurrent). GCD автоматически управляет пулом потоков, что упрощает работу с многопоточностью.
DispatchQueue.global(qos: .background).async {
// Выполнить тяжёлую операцию в фоновом потоке
let result = performHeavyComputation()
DispatchQueue.main.async {
// Вернуться к главному потоку для обновления UI
self.updateUI(with: result)
}
}2️⃣Operation и OperationQueue
Это абстрактный класс, который представляет собой одиночную задачу. Задачи, представленные операциями (
Operation), могут быть добавлены в OperationQueue, который управляет их параллельным или последовательным выполнением. Operation и OperationQueue предоставляют больше контроля и гибкости по сравнению с GCD, позволяя устанавливать зависимости между операциями, приостанавливать и возобновлять их выполнение.let operationQueue = OperationQueue()
let operation1 = BlockOperation {
// Выполнить задачу 1
}
let operation2 = BlockOperation {
// Выполнить задачу 2
}
operation2.addDependency(operation1) // Задача 2 не начнется, пока не завершится задача 1
operationQueue.addOperations([operation1, operation2], waitUntilFinished: false)
3️⃣async/await (Swift 5.5 и выше)
async/await упрощает асинхронное программирование, делая асинхронный код более читабельным и похожим на синхронный. Это существенно упрощает работу с асинхронными операциями, такими как сетевые запросы или долгие вычисления, и обеспечивает более безопасное и удобное управление потоками.
func fetchData() async throws -> Data {
let url = URL(string: "https://example.com/data")!
let (data, _) = try await URLSession.shared.data(from: url)
return data
}
// Где-то в асинхронном контексте
Task {
do {
let data = try await fetchData()
// Обработка данных
} catch {
// Обработка ошибки
}
}Для реализации многопоточности применяются Grand Central Dispatch (GCD),
Operation и OperationQueue для управления асинхронными операциями и параллельным выполнением задач. С появлением Swift 5.5 добавился новый удобный способ работы с асинхронностью через async/await, который делает код более читабельным и упрощает работу с асинхронными операциями.👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Можно ли добавить структуру в extension ?
Спросят с вероятностью 18%
Можно использовать расширения (extensions) для добавления новой функциональности к существующим типам, включая классы, структуры, перечисления и даже протоколы. Расширения позволяют добавлять новые методы, вычисляемые свойства, инициализаторы, сабскрипты, вложенные типы и протоколы к существующим типам. Однако, есть ограничения на то, что можно добавить через расширения.
Что можно добавить через него:
1️⃣Методы экземпляра и типа
2️⃣Вычисляемые свойства экземпляра и типа
3️⃣Новые инициализаторы (только для структур и классов в том же файле)
4️⃣Определения протоколов
5️⃣Вложенные типы
Что нельзя добавить через него:
✅Хранимые свойства
✅Свойства свойства наблюдателя
Примеры его использования:
Расширение структуры с новым методом:
Добавление вычисляемого свойства:
Добавление нового инициализатора (только в том же файле для классов, для структур такое ограничение отсутствует):
Ответ на ваш вопрос
Можно определить вложенный тип внутри расширения.
Пример:
Этот пример добавляет вложенную структуру и вычисляемое свойство к
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Можно использовать расширения (extensions) для добавления новой функциональности к существующим типам, включая классы, структуры, перечисления и даже протоколы. Расширения позволяют добавлять новые методы, вычисляемые свойства, инициализаторы, сабскрипты, вложенные типы и протоколы к существующим типам. Однако, есть ограничения на то, что можно добавить через расширения.
Что можно добавить через него:
1️⃣Методы экземпляра и типа
2️⃣Вычисляемые свойства экземпляра и типа
3️⃣Новые инициализаторы (только для структур и классов в том же файле)
4️⃣Определения протоколов
5️⃣Вложенные типы
Что нельзя добавить через него:
✅Хранимые свойства
✅Свойства свойства наблюдателя
Примеры его использования:
Расширение структуры с новым методом:
struct Point {
var x: Int
var y: Int
}
extension Point {
func isToTheRightOf(x: Int) -> Bool {
return self.x > x
}
}
let somePoint = Point(x: 10, y: 5)
print(somePoint.isToTheRightOf(x: 4)) // Вывод: trueДобавление вычисляемого свойства:
extension Point {
var isOrigin: Bool {
return x == 0 && y == 0
}
}
let originPoint = Point(x: 0, y: 0)
print(originPoint.isOrigin) // Вывод: trueДобавление нового инициализатора (только в том же файле для классов, для структур такое ограничение отсутствует):
extension Point {
init() {
self.init(x: 0, y: 0)
}
}
let defaultPoint = Point()
print(defaultPoint) // Вывод: Point(x: 0, y: 0)Ответ на ваш вопрос
Можно определить вложенный тип внутри расширения.
Пример:
extension Array where Element: Numeric {
struct Summary {
var total: Element
var count: Int
}
var summary: Summary {
return Summary(total: self.reduce(0, +), count: self.count)
}
}
let numbers = [1, 2, 3, 4, 5]
let numbersSummary = numbers.summary
print("Total: \(numbersSummary.total), Count: \(numbersSummary.count)") // Вывод: Total: 15, Count: 5Этот пример добавляет вложенную структуру и вычисляемое свойство к
Array через расширение, что позволяет легко получить сводку по массиву чисел.👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍1
Anonymous Quiz
45%
lazy
12%
weak
31%
transient
12%
volatile
Можно ли добавить структуру в extension ?
Спросят с вероятностью 18%
Можно использовать расширения (extensions) для добавления новой функциональности к существующим типам, включая классы, структуры, перечисления и даже протоколы. Расширения позволяют добавлять новые методы, вычисляемые свойства, инициализаторы, сабскрипты, вложенные типы и протоколы к существующим типам. Однако, есть ограничения на то, что можно добавить через расширения.
Что можно добавить через него:
1️⃣Методы экземпляра и типа
2️⃣Вычисляемые свойства экземпляра и типа
3️⃣Новые инициализаторы (только для структур и классов в том же файле)
4️⃣Определения протоколов
5️⃣Вложенные типы
Что нельзя добавить через него:
✅Хранимые свойства
✅Свойства свойства наблюдателя
Примеры его использования:
Расширение структуры с новым методом:
Добавление вычисляемого свойства:
Добавление нового инициализатора (только в том же файле для классов, для структур такое ограничение отсутствует):
Ответ на ваш вопрос
Можно определить вложенный тип внутри расширения.
Пример:
Этот пример добавляет вложенную структуру и вычисляемое свойство к
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Можно использовать расширения (extensions) для добавления новой функциональности к существующим типам, включая классы, структуры, перечисления и даже протоколы. Расширения позволяют добавлять новые методы, вычисляемые свойства, инициализаторы, сабскрипты, вложенные типы и протоколы к существующим типам. Однако, есть ограничения на то, что можно добавить через расширения.
Что можно добавить через него:
1️⃣Методы экземпляра и типа
2️⃣Вычисляемые свойства экземпляра и типа
3️⃣Новые инициализаторы (только для структур и классов в том же файле)
4️⃣Определения протоколов
5️⃣Вложенные типы
Что нельзя добавить через него:
✅Хранимые свойства
✅Свойства свойства наблюдателя
Примеры его использования:
Расширение структуры с новым методом:
struct Point {
var x: Int
var y: Int
}
extension Point {
func isToTheRightOf(x: Int) -> Bool {
return self.x > x
}
}
let somePoint = Point(x: 10, y: 5)
print(somePoint.isToTheRightOf(x: 4)) // Вывод: trueДобавление вычисляемого свойства:
extension Point {
var isOrigin: Bool {
return x == 0 && y == 0
}
}
let originPoint = Point(x: 0, y: 0)
print(originPoint.isOrigin) // Вывод: trueДобавление нового инициализатора (только в том же файле для классов, для структур такое ограничение отсутствует):
extension Point {
init() {
self.init(x: 0, y: 0)
}
}
let defaultPoint = Point()
print(defaultPoint) // Вывод: Point(x: 0, y: 0)Ответ на ваш вопрос
Можно определить вложенный тип внутри расширения.
Пример:
extension Array where Element: Numeric {
struct Summary {
var total: Element
var count: Int
}
var summary: Summary {
return Summary(total: self.reduce(0, +), count: self.count)
}
}
let numbers = [1, 2, 3, 4, 5]
let numbersSummary = numbers.summary
print("Total: \(numbersSummary.total), Count: \(numbersSummary.count)") // Вывод: Total: 15, Count: 5Этот пример добавляет вложенную структуру и вычисляемое свойство к
Array через расширение, что позволяет легко получить сводку по массиву чисел.👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👀1
Какие можно выделить главные принципы ООП ?
Спросят с вероятностью 27%
Объектно-ориентированное программирование (ООП) — это парадигма, основанная на концепции "объектов", которые могут содержать данные в виде полей (часто называемых атрибутами или свойствами) и код в виде процедур (часто называемых методами). ООП фокусируется на использовании объектов для моделирования реального мира (или абстракций), облегчая разработку и поддержку сложных программ. Существует четыре основных принципа:
1️⃣Инкапсуляция
Механизм ООП, который объединяет данные (атрибуты) и код (методы), манипулирующий этими данными, внутри одного объекта и скрывает детали реализации от внешнего использования. Это позволяет защитить внутреннее состояние объекта от прямого доступа извне и обеспечить контролируемый интерфейс для работы с этим объектом.
2️⃣Наследование
Позволяет создавать новый класс на основе уже существующего класса, перенимая его свойства и методы. Новый класс может добавлять собственные свойства и методы или модифицировать унаследованные. Наследование обеспечивает повторное использование кода, упрощает его расширение и поддержку.
3️⃣Полиморфизм
Способность объектов с одинаковым интерфейсом предоставлять различную реализацию для одного и того же метода. Это означает, что функция или метод могут использоваться для различных типов объектов, и каждый тип может реализовать эту функцию или метод по-своему. Полиморфизм упрощает написание общего кода для работы с объектами разных классов и обеспечивает гибкость в его использовании.
4️⃣Абстракция
Позволяет скрыть сложность системы, представляя её ключевые аспекты и скрывая детали реализации. Это достигается за счёт использования абстрактных классов и интерфейсов, которые определяют шаблон для классов-наследников. Абстракция помогает сосредоточиться на взаимодействии объектов на более высоком уровне, игнорируя ненужные детали.
Основные принципы ООП — инкапсуляция, наследование, полиморфизм и абстракция — создают основу для проектирования и разработки ПО, делая код более модульным, переиспользуемым и поддерживаемым. Эти принципы помогают лучше структурировать и организовывать свой код для решения сложных задач программирования.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 27%
Объектно-ориентированное программирование (ООП) — это парадигма, основанная на концепции "объектов", которые могут содержать данные в виде полей (часто называемых атрибутами или свойствами) и код в виде процедур (часто называемых методами). ООП фокусируется на использовании объектов для моделирования реального мира (или абстракций), облегчая разработку и поддержку сложных программ. Существует четыре основных принципа:
1️⃣Инкапсуляция
Механизм ООП, который объединяет данные (атрибуты) и код (методы), манипулирующий этими данными, внутри одного объекта и скрывает детали реализации от внешнего использования. Это позволяет защитить внутреннее состояние объекта от прямого доступа извне и обеспечить контролируемый интерфейс для работы с этим объектом.
2️⃣Наследование
Позволяет создавать новый класс на основе уже существующего класса, перенимая его свойства и методы. Новый класс может добавлять собственные свойства и методы или модифицировать унаследованные. Наследование обеспечивает повторное использование кода, упрощает его расширение и поддержку.
3️⃣Полиморфизм
Способность объектов с одинаковым интерфейсом предоставлять различную реализацию для одного и того же метода. Это означает, что функция или метод могут использоваться для различных типов объектов, и каждый тип может реализовать эту функцию или метод по-своему. Полиморфизм упрощает написание общего кода для работы с объектами разных классов и обеспечивает гибкость в его использовании.
4️⃣Абстракция
Позволяет скрыть сложность системы, представляя её ключевые аспекты и скрывая детали реализации. Это достигается за счёт использования абстрактных классов и интерфейсов, которые определяют шаблон для классов-наследников. Абстракция помогает сосредоточиться на взаимодействии объектов на более высоком уровне, игнорируя ненужные детали.
Основные принципы ООП — инкапсуляция, наследование, полиморфизм и абстракция — создают основу для проектирования и разработки ПО, делая код более модульным, переиспользуемым и поддерживаемым. Эти принципы помогают лучше структурировать и организовывать свой код для решения сложных задач программирования.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Anonymous Quiz
93%
print()
2%
echo()
3%
log()
2%
output
Inam относится ли к value тайпам ?
Спросят с вероятностью 18%
enum (перечисления) относится к типам значений (value types). Это означает, что при передаче перечисления функции или при его присвоении переменной создается новая копия этого перечисления. Это работает аналогично другим типам значений, таким как
Особенности:
1️⃣Копирование при присвоении: Когда переменной перечисления присваивается значение другой переменной перечисления, создается независимая копия этого значения.
2️⃣Безопасность типов:
3️⃣Связанные значения:
В этом примере
4️⃣Методы:
Здесь метод
Пример:
Когда
Перечисления (
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
enum (перечисления) относится к типам значений (value types). Это означает, что при передаче перечисления функции или при его присвоении переменной создается новая копия этого перечисления. Это работает аналогично другим типам значений, таким как
struct и базовые типы данных (Int, String, Double и т.д.).Особенности:
1️⃣Копирование при присвоении: Когда переменной перечисления присваивается значение другой переменной перечисления, создается независимая копия этого значения.
2️⃣Безопасность типов:
enum поддерживает безопасность типов, что позволяет создавать код, легкий для понимания и поддержки.3️⃣Связанные значения:
enum может хранить связанные значения различных типов. Например:enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
В этом примере
Barcode может хранить либо UPC с четырьмя числовыми значениями, либо QR-код в виде строки.4️⃣Методы:
enum может иметь методы, которые предоставляют функциональность, связанную с перечислением.enum Planet {
case earth, mars, venus
func isHabitable() -> Bool {
switch self {
case .earth:
return true
default:
return false
}
}
}
Здесь метод
isHabitable позволяет определить, пригодна ли планета для жизни.Пример:
enum TrafficLight {
case red, yellow, green
}
var light = TrafficLight.red
var lightCopy = light
lightCopy = .green
print(light) // Выводит "red"
print(lightCopy) // Выводит "green"Когда
lightCopy изменяется, это не влияет на исходное значение light, что демонстрирует поведение типа значения.Перечисления (
enum) — это типы значений, которые предоставляют способ группировать вместе связанные значения таким образом, чтобы с ними было удобно и безопасно работать, обеспечивая при этом независимость и изолированность копий.👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
🤯3👍1🤔1
Какой тип коллекций в Swift'е: value или reference ?
Спросят с вероятностью 27%
Коллекции, такие как массивы (
Типы значений (Value Types)
Когда вы работаете с ними, любые изменения, вносимые в переменную или константу, не влияют на исходный экземпляр, с которым они были скопированы. В контексте коллекций это значит, что при копировании массива, словаря или множества создаётся новая, независимая копия этих данных. Рассмотрим пример с массивом:
В этом примере изменения
Зачем они нужны?
Использование типов значений для коллекций упрощает управление памятью и делает поведение программы более предсказуемым, поскольку вы точно знаете, что изменение данных в одном месте не повлияет на данные в другом. Это особенно важно в многопоточных и параллельных вычислениях, где непредвиденное изменение данных может привести к ошибкам.
Коллекции — это типы значений, что помогает в управлении памятью и обеспечивает безопасность работы с данными, особенно в многопоточных приложениях. Это означает, что каждая коллекция независима и изменения в одной коллекции не влияют на другие копии этой коллекции.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 27%
Коллекции, такие как массивы (
Array), словари (Dictionary) и множества (Set), реализованы как структуры, что означает, что они являются типами значений (value types). Это имеет важные последствия для работы с коллекциями в Swift.Типы значений (Value Types)
Когда вы работаете с ними, любые изменения, вносимые в переменную или константу, не влияют на исходный экземпляр, с которым они были скопированы. В контексте коллекций это значит, что при копировании массива, словаря или множества создаётся новая, независимая копия этих данных. Рассмотрим пример с массивом:
var originalArray = [1, 2, 3]
var copiedArray = originalArray // Копия originalArray
copiedArray.append(4) // Изменение copiedArray
print(originalArray) // Выводит [1, 2, 3]
print(copiedArray) // Выводит [1, 2, 3, 4]
В этом примере изменения
copiedArray не влияют на originalArray благодаря механизму копирования при записи (Copy-On-Write, COW). Этот механизм оптимизирует работу с памятью, копируя данные только в момент их изменения.Зачем они нужны?
Использование типов значений для коллекций упрощает управление памятью и делает поведение программы более предсказуемым, поскольку вы точно знаете, что изменение данных в одном месте не повлияет на данные в другом. Это особенно важно в многопоточных и параллельных вычислениях, где непредвиденное изменение данных может привести к ошибкам.
Коллекции — это типы значений, что помогает в управлении памятью и обеспечивает безопасность работы с данными, особенно в многопоточных приложениях. Это означает, что каждая коллекция независима и изменения в одной коллекции не влияют на другие копии этой коллекции.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Что такое hip object ?
Спросят с вероятностью 18%
Термин "hip object" может вызвать некоторое недоумение, так как он не является стандартным термином. Однако, если рассматривать контекст вопроса, возможно, произошла опечатка или недоразумение, и имелся в виду термин "heap object".
Что это такое?
Объекты на куче (heap objects) — это объекты, для которых память выделяется в области памяти, известной как "куча" (heap). Во многих языках куча используется для динамического выделения памяти во время выполнения программы.
Особенности:
1️⃣Динамическое выделение памяти: Память для них выделяется и освобождается динамически, что позволяет использовать память гибко и эффективно в зависимости от текущих потребностей программы.
2️⃣Управление памятью: В языках с автоматическим управлением памятью, таких как Java или Python, сборщик мусора автоматически освобождает память, занятую объектами, которые больше не используются. В языках, требующих явного управления памятью, таких как C или C++, программист должен самостоятельно освобождать память, выделенную для объектов на куче.
3️⃣Время жизни: Объекты на куче могут сохраняться в памяти в течение всего времени выполнения программы, если не будет явно освобождена память, которую они занимают. Это отличает их от объектов, размещенных на стеке, время жизни которых ограничено временем жизни вызова функции, в которой они были созданы.
4️⃣Доступ: Доступ к объектам на куче обычно осуществляется через указатели или ссылки, так как их точное местоположение в памяти не известно во время компиляции и определяется во время выполнения.
Если в вашем вопросе действительно имелся в виду "heap object", то объяснение выше должно дать полное представление об этом понятии. Если же "hip object" означает что-то иное в специфическом контексте или технологии, уточните, пожалуйста, контекст или область применения, чтобы я мог предоставить более точный ответ.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Термин "hip object" может вызвать некоторое недоумение, так как он не является стандартным термином. Однако, если рассматривать контекст вопроса, возможно, произошла опечатка или недоразумение, и имелся в виду термин "heap object".
Что это такое?
Объекты на куче (heap objects) — это объекты, для которых память выделяется в области памяти, известной как "куча" (heap). Во многих языках куча используется для динамического выделения памяти во время выполнения программы.
Особенности:
1️⃣Динамическое выделение памяти: Память для них выделяется и освобождается динамически, что позволяет использовать память гибко и эффективно в зависимости от текущих потребностей программы.
2️⃣Управление памятью: В языках с автоматическим управлением памятью, таких как Java или Python, сборщик мусора автоматически освобождает память, занятую объектами, которые больше не используются. В языках, требующих явного управления памятью, таких как C или C++, программист должен самостоятельно освобождать память, выделенную для объектов на куче.
3️⃣Время жизни: Объекты на куче могут сохраняться в памяти в течение всего времени выполнения программы, если не будет явно освобождена память, которую они занимают. Это отличает их от объектов, размещенных на стеке, время жизни которых ограничено временем жизни вызова функции, в которой они были созданы.
4️⃣Доступ: Доступ к объектам на куче обычно осуществляется через указатели или ссылки, так как их точное местоположение в памяти не известно во время компиляции и определяется во время выполнения.
Если в вашем вопросе действительно имелся в виду "heap object", то объяснение выше должно дать полное представление об этом понятии. Если же "hip object" означает что-то иное в специфическом контексте или технологии, уточните, пожалуйста, контекст или область применения, чтобы я мог предоставить более точный ответ.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
😁7👍2❤1
Anonymous Quiz
49%
Dispatch Semaphores
22%
Dispatch Queue
19%
Synchronous Lock
10%
Atomic Operations