Чем отличается frame от bounce ?
Спросят с вероятностью 36%
Понятия frame и bounds относятся к свойствам представлений (views), но имеют разные значения и используются в разных целях.
Frame
Представляет собой прямоугольник, который определяет положение и размер представления относительно его родительского представления (superview). Координаты
✅Пример: Если
Bounds
Представляет собой прямоугольник, который определяет область отображения содержимого представления, но его координаты указываются в собственной системе координат представления. Это означает, что
✅Пример: Если
Основные отличия
✅Система координат:
✅Использование:
Понимание различий между
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 36%
Понятия frame и bounds относятся к свойствам представлений (views), но имеют разные значения и используются в разных целях.
Frame
Представляет собой прямоугольник, который определяет положение и размер представления относительно его родительского представления (superview). Координаты
frame указываются в системе координат родительского представления. Это означает, что frame показывает, где именно находится представление в родительском представлении и какого оно размера.✅Пример: Если
frame представления A равен (10, 20, 100, 200), это означает, что верхний левый угол A находится на 10 пикселей вправо и 20 пикселей вниз относительно верхнего левого угла его родительского представления, а размер A составляет 100 пикселей в ширину и 200 пикселей в высоту.Bounds
Представляет собой прямоугольник, который определяет область отображения содержимого представления, но его координаты указываются в собственной системе координат представления. Это означает, что
bounds представления всегда начинается с (0, 0) для верхнего левого угла. Изменение bounds может влиять на то, какое содержимое представления видимо, особенно если используется прокрутка.✅Пример: Если
bounds представления B равен (0, 0, 300, 400), это означает, что видимая область содержимого B начинается с верхнего левого угла и имеет размер 300 пикселей в ширину и 400 пикселей в высоту. Если вы измените bounds так, чтобы они начинались, например, с (50, 50, 300, 400), это сдвинет видимую область содержимого так, что верхняя левая точка видимого содержимого будет находиться на 50 пикселей вправо и 50 пикселей вниз от исходной верхней левой точки содержимого B.Основные отличия
✅Система координат:
Frame использует систему координат родительского представления, в то время как bounds использует собственную систему координат представления.✅Использование:
Frame чаще всего используется для определения положения и размера представления относительно его родительского представления, а bounds — для работы с содержимым внутри представления, например, когда необходимо управлять прокруткой.Понимание различий между
frame и bounds важно для правильной работы с макетами интерфейса и управлением представлениями в iOS и macOS разработке.👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍2
👾 Ребят, напоминаю, у нас есть приватные группы где мы делимся реальными собеседованиями и тестовыми заданиями. Чтобы попасть в эти в группы воспользуйтесь ботами:
🤖 Доступ к базе собесов
🤖 Доступ к базе тестовых заданий
🤖 Доступ к базе собесов
🤖 Доступ к базе тестовых заданий
Каков жизненный цикл UIViewController ?
Спросят с вероятностью 36%
Жизненный цикл
1️⃣Инициализация
Жизненный цикл начинается с инициализации. Обычно это происходит либо через инициализатор
2️⃣Загрузка представления
✅`loadView`: Вызывается, когда представление контроллера загружается в память. Этот метод создаёт и назначает основное view контроллера, обычно не требуется его переопределять, если вы используете storyboard или xib-файлы.
✅`viewDidLoad`: Вызывается после загрузки основного представления контроллера в память. Здесь вы обычно выполняете начальную настройку интерфейса, которая должна произойти один раз за время жизни контроллера.
3️⃣Появление представления
✅`viewWillAppear(_:)`: Вызывается непосредственно перед тем, как представление контроллера станет видимым пользователю. Здесь можно настроить интерфейс или данные, которые должны обновляться каждый раз перед отображением представления.
✅`viewDidAppear(_:)`: Вызывается после того, как представление контроллера стало видимым пользователю. Здесь можно начать анимации, запустить процессы, которые должны происходить после того, как представление стало видимым.
4️⃣Обновление макета
✅`viewWillLayoutSubviews`: Вызывается перед тем, как контроллер представления расположит свои подпредставления. Это хорошее место, чтобы изменить размер или положение подпредставлений вручную.
✅`viewDidLayoutSubviews`: Вызывается после того, как контроллер представления расположил свои подпредставления. Здесь можно выполнить дополнительные настройки макета, зависящие от размеров подпредставлений.
5️⃣Исчезновение представления
✅`viewWillDisappear(_:)`: Вызывается непосредственно перед тем, как представление контроллера будет удалено с экрана. Используется для остановки анимаций или тяжёлых задач, сохранения состояния и так далее.
✅`viewDidDisappear(_:)`: Вызывается после того, как представление контроллера исчезло с экрана. Здесь можно очистить ресурсы, связанные с отображением представления.
6️⃣Уничтожение контроллера
✅`deinit`: Вызывается непосредственно перед тем, как контроллер представления будет уничтожен. Это место для очистки и освобождения ресурсов.
Понимание каждого из этих этапов жизненного цикла позволяет разработчику правильно управлять ресурсами, настраивать интерфейс и реагировать на изменения, связанные с появлением и исчезновением представлений.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 36%
Жизненный цикл
UIViewController описывает последовательность событий, происходящих с момента создания до уничтожения контроллера представления. Понимание этого жизненного цикла критически важно для правильного управления загрузкой, отображением, обновлением и уничтожением представлений в iOS-приложении. Вот ключевые этапы:1️⃣Инициализация
Жизненный цикл начинается с инициализации. Обычно это происходит либо через инициализатор
init(coder:) при загрузке контроллера из storyboard, либо через init(nibName:bundle:), если контроллер создаётся программно.2️⃣Загрузка представления
✅`loadView`: Вызывается, когда представление контроллера загружается в память. Этот метод создаёт и назначает основное view контроллера, обычно не требуется его переопределять, если вы используете storyboard или xib-файлы.
✅`viewDidLoad`: Вызывается после загрузки основного представления контроллера в память. Здесь вы обычно выполняете начальную настройку интерфейса, которая должна произойти один раз за время жизни контроллера.
3️⃣Появление представления
✅`viewWillAppear(_:)`: Вызывается непосредственно перед тем, как представление контроллера станет видимым пользователю. Здесь можно настроить интерфейс или данные, которые должны обновляться каждый раз перед отображением представления.
✅`viewDidAppear(_:)`: Вызывается после того, как представление контроллера стало видимым пользователю. Здесь можно начать анимации, запустить процессы, которые должны происходить после того, как представление стало видимым.
4️⃣Обновление макета
✅`viewWillLayoutSubviews`: Вызывается перед тем, как контроллер представления расположит свои подпредставления. Это хорошее место, чтобы изменить размер или положение подпредставлений вручную.
✅`viewDidLayoutSubviews`: Вызывается после того, как контроллер представления расположил свои подпредставления. Здесь можно выполнить дополнительные настройки макета, зависящие от размеров подпредставлений.
5️⃣Исчезновение представления
✅`viewWillDisappear(_:)`: Вызывается непосредственно перед тем, как представление контроллера будет удалено с экрана. Используется для остановки анимаций или тяжёлых задач, сохранения состояния и так далее.
✅`viewDidDisappear(_:)`: Вызывается после того, как представление контроллера исчезло с экрана. Здесь можно очистить ресурсы, связанные с отображением представления.
6️⃣Уничтожение контроллера
✅`deinit`: Вызывается непосредственно перед тем, как контроллер представления будет уничтожен. Это место для очистки и освобождения ресурсов.
Понимание каждого из этих этапов жизненного цикла позволяет разработчику правильно управлять ресурсами, настраивать интерфейс и реагировать на изменения, связанные с появлением и исчезновением представлений.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍7❤1
Что известно о коллекциях (collection) ?
Спросят с вероятностью 18%
Коллекции — это структуры данных, предназначенные для группировки нескольких элементов. Они позволяют хранить, извлекать, манипулировать и коммуницировать с группами объектов. Различные языки программирования предлагают разные типы коллекций, но многие из них обладают общими чертами и функциональностью.
Общие типы коллекций
1️⃣Массивы (Arrays): Это самая базовая форма коллекций, представляющая собой упорядоченную последовательность элементов фиксированной длины. Они обеспечивают быстрый доступ к элементам по индексу.
2️⃣Списки (Lists): Списки похожи на массивы, но они позволяют динамически изменять размер. В зависимости от реализации, списки могут быть связанными списками (LinkedList) или массивными списками (ArrayList), каждый из которых имеет свои преимущества и недостатки в плане производительности операций вставки, удаления и доступа.
3️⃣Множества (Sets): Это коллекции, которые хранят только уникальные элементы. Они полезны, когда вам нужно обеспечить, чтобы в коллекции не было дубликатов. Примеры включают HashSet, который обеспечивает быстрый доступ за счет использования хеш-таблиц, и TreeSet, который сохраняет элементы в упорядоченном виде.
4️⃣Словари (Maps): Словари, или ассоциативные массивы, хранят данные в форме пар ключ-значение. Они позволяют быстро извлекать значение по ключу. Примеры включают HashMap и TreeMap.
5️⃣Очереди (Queues) и стеки (Stacks): Очереди обеспечивают порядок доступа First-In-First-Out (FIFO), тогда как стеки работают по принципу Last-In-First-Out (LIFO). Они используются во многих алгоритмах, например, в задачах парсинга или управления потоками выполнения.
Особенности и применение
✅Обобщение: Многие системы типов поддерживают обобщённые коллекции, позволяющие определять тип элементов, которые коллекция может содержать. Это обеспечивает типобезопасность и гибкость при работе с различными типами данных.
✅Производительность: Разные типы коллекций оптимизированы для различных операций. Например, доступ к элементу в массиве происходит за время O(1), в то время как вставка в середину списка может быть O(n). Выбор правильного типа коллекции важен для обеспечения оптимальной производительности приложения.
✅Итерация: Большинство коллекций поддерживают итерацию по своим элементам, что позволяет легко перебирать элементы коллекции.
Коллекции являются фундаментальной частью большинства программных систем и позволяют разработчикам эффективно управлять наборами данных в своих приложениях. Понимание различных типов коллекций и их свойств критически важно для создания эффективного и масштабируемого кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Коллекции — это структуры данных, предназначенные для группировки нескольких элементов. Они позволяют хранить, извлекать, манипулировать и коммуницировать с группами объектов. Различные языки программирования предлагают разные типы коллекций, но многие из них обладают общими чертами и функциональностью.
Общие типы коллекций
1️⃣Массивы (Arrays): Это самая базовая форма коллекций, представляющая собой упорядоченную последовательность элементов фиксированной длины. Они обеспечивают быстрый доступ к элементам по индексу.
2️⃣Списки (Lists): Списки похожи на массивы, но они позволяют динамически изменять размер. В зависимости от реализации, списки могут быть связанными списками (LinkedList) или массивными списками (ArrayList), каждый из которых имеет свои преимущества и недостатки в плане производительности операций вставки, удаления и доступа.
3️⃣Множества (Sets): Это коллекции, которые хранят только уникальные элементы. Они полезны, когда вам нужно обеспечить, чтобы в коллекции не было дубликатов. Примеры включают HashSet, который обеспечивает быстрый доступ за счет использования хеш-таблиц, и TreeSet, который сохраняет элементы в упорядоченном виде.
4️⃣Словари (Maps): Словари, или ассоциативные массивы, хранят данные в форме пар ключ-значение. Они позволяют быстро извлекать значение по ключу. Примеры включают HashMap и TreeMap.
5️⃣Очереди (Queues) и стеки (Stacks): Очереди обеспечивают порядок доступа First-In-First-Out (FIFO), тогда как стеки работают по принципу Last-In-First-Out (LIFO). Они используются во многих алгоритмах, например, в задачах парсинга или управления потоками выполнения.
Особенности и применение
✅Обобщение: Многие системы типов поддерживают обобщённые коллекции, позволяющие определять тип элементов, которые коллекция может содержать. Это обеспечивает типобезопасность и гибкость при работе с различными типами данных.
✅Производительность: Разные типы коллекций оптимизированы для различных операций. Например, доступ к элементу в массиве происходит за время O(1), в то время как вставка в середину списка может быть O(n). Выбор правильного типа коллекции важен для обеспечения оптимальной производительности приложения.
✅Итерация: Большинство коллекций поддерживают итерацию по своим элементам, что позволяет легко перебирать элементы коллекции.
Коллекции являются фундаментальной частью большинства программных систем и позволяют разработчикам эффективно управлять наборами данных в своих приложениях. Понимание различных типов коллекций и их свойств критически важно для создания эффективного и масштабируемого кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍2
Друзья!
Хочу вас познакомить с замечательным пабликом SwiftyGroup! Здесь вы найдете ответы на самые актуальные вопросы с собеседований, а также сможете порешать интересные задачи и ознакомиться с полезными статьями.
В SwiftyGroup мы еженедельно публикуем:
Вопросы и ответы с реальных собеседований
Статьи по подготовке к собеседованиям и развитию профессиональных навыков
Задачи для самостоятельного решения и проверки своих знаний
Присоединяйтесь к нашему сообществу и будьте всегда готовы к любым профессиональным вызовам!
Хочу вас познакомить с замечательным пабликом SwiftyGroup! Здесь вы найдете ответы на самые актуальные вопросы с собеседований, а также сможете порешать интересные задачи и ознакомиться с полезными статьями.
В SwiftyGroup мы еженедельно публикуем:
Вопросы и ответы с реальных собеседований
Статьи по подготовке к собеседованиям и развитию профессиональных навыков
Задачи для самостоятельного решения и проверки своих знаний
Присоединяйтесь к нашему сообществу и будьте всегда готовы к любым профессиональным вызовам!
Telegram
SwiftyGroup
Собираю единомышленников для совместного изучения Swift, подготовки к собеседованиям и прокачивания скилов:)
Чат группы:
https://t.me/swiftygroup
@swiftygroup
Все самое интересное:
https://boosty.to/buik
Админ:
@VladimirBuik
Чат группы:
https://t.me/swiftygroup
@swiftygroup
Все самое интересное:
https://boosty.to/buik
Админ:
@VladimirBuik
🔥2👀1
Что такое enum, raw value и associated value ?
Спросят с вероятностью 36%
enum (перечисление)
Raw Values (Базовые значения)
Представляют собой предустановленные значения для каждого из случаев перечисления. Все случаи перечисления имеют один и тот же тип данных для своих "raw values". Эти значения могут быть строками, символами, числами или значениями любого другого типа, который соответствует протоколу
Пример:
Associated Values (Ассоциированные значения)
Позволяют хранить дополнительную информацию о случае перечисления. Это делает перечисления похожими на алгебраические типы данных, где каждый случай может иметь свои собственные ассоциированные данные разных типов. Эти значения делают перечисления чрезвычайно гибкими и мощными для моделирования сложных данных и состояний.
Пример:
В этом примере
✅Raw Values полезны, когда нужно закодировать некоторые фиксированные значения или когда значения перечисления должны быть совместимы с внешней системой.
✅Associated Values используются для создания перечислений, которые могут представлять сложные данные и состояния, где каждый случай перечисления может иметь уникальный набор данных.
Перечисления являются мощным средством для организации связанных значений в вашем коде, позволяя при этом сохранять типобезопасность и ясность.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 36%
enum (перечисление)
— это тип, который позволяет группировать вместе тесно связанные значения. Перечисления могут иметь "raw values" (базовые значения), "associated values" (ассоциированные значения) или и то, и другое, что делает их мощным инструментом.Raw Values (Базовые значения)
Представляют собой предустановленные значения для каждого из случаев перечисления. Все случаи перечисления имеют один и тот же тип данных для своих "raw values". Эти значения могут быть строками, символами, числами или значениями любого другого типа, который соответствует протоколу
RawRepresentable.Пример:
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
Здесь каждому случаю перечисления Planet присваивается целочисленное значение, начиная с 1 для mercury и увеличиваясь на 1 для каждого последующего случая.Associated Values (Ассоциированные значения)
Позволяют хранить дополнительную информацию о случае перечисления. Это делает перечисления похожими на алгебраические типы данных, где каждый случай может иметь свои собственные ассоциированные данные разных типов. Эти значения делают перечисления чрезвычайно гибкими и мощными для моделирования сложных данных и состояний.
Пример:
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")В этом примере
Barcode может быть либо UPC-кодом с четырьмя целочисленными значениями, либо QR-кодом со строковым значением.✅Raw Values полезны, когда нужно закодировать некоторые фиксированные значения или когда значения перечисления должны быть совместимы с внешней системой.
✅Associated Values используются для создания перечислений, которые могут представлять сложные данные и состояния, где каждый случай перечисления может иметь уникальный набор данных.
Перечисления являются мощным средством для организации связанных значений в вашем коде, позволяя при этом сохранять типобезопасность и ясность.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍7❤1🔥1
Что такое синхронная задача ?
Спросят с вероятностью 36%
Синхронная задача — это такая операция или задача, выполнение которой блокирует дальнейшее продвижение программы до тех пор, пока она не будет завершена. То есть, при запуске синхронной задачи программа останавливает все последующие операции и ждёт, когда задача будет выполнена, прежде чем продолжить выполнение другого кода.
Эти операции просты в понимании и реализации, так как они следуют прямой последовательности выполнения: программа выполняет одну операцию за другой, в точном порядке их появления в коде. Это может быть полезно, когда нужно гарантировать, что некоторые данные будут обработаны или подготовлены до начала следующей операции.
Однако данное выполнение может негативно сказаться на производительности приложения, особенно если задача включает в себя длительные операции, такие как сетевые запросы или обращение к базе данных. В таких случаях приложение может "замерзать" и становиться неотзывчивым на действия пользователя до завершения задачи.
Пример:
В этом примере
Асинхронное выполнение позволяет приложению продолжать обрабатывать другие события или задачи, в то время как ожидается завершение длительной операции, тем самым улучшая взаимодействие с пользователем и общую производительность.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 36%
Синхронная задача — это такая операция или задача, выполнение которой блокирует дальнейшее продвижение программы до тех пор, пока она не будет завершена. То есть, при запуске синхронной задачи программа останавливает все последующие операции и ждёт, когда задача будет выполнена, прежде чем продолжить выполнение другого кода.
Эти операции просты в понимании и реализации, так как они следуют прямой последовательности выполнения: программа выполняет одну операцию за другой, в точном порядке их появления в коде. Это может быть полезно, когда нужно гарантировать, что некоторые данные будут обработаны или подготовлены до начала следующей операции.
Однако данное выполнение может негативно сказаться на производительности приложения, особенно если задача включает в себя длительные операции, такие как сетевые запросы или обращение к базе данных. В таких случаях приложение может "замерзать" и становиться неотзывчивым на действия пользователя до завершения задачи.
Пример:
func loadUserData() {
let userData = fetchUserData() // Синхронный вызов, блокирующий поток
updateUI(with: userData) // Этот код будет выполнен только после завершения fetchUserData()
}В этом примере
fetchUserData() выполняется синхронно: updateUI(with:) не начнёт выполняться, пока fetchUserData() полностью не завершится и не вернёт данные пользователя.Асинхронное выполнение позволяет приложению продолжать обрабатывать другие события или задачи, в то время как ожидается завершение длительной операции, тем самым улучшая взаимодействие с пользователем и общую производительность.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍7❤2
В чём разница между open и public ?
Спросят с вероятностью 36%
open и public — это модификаторы доступа, которые определяют, как и где можно использовать классы, методы и свойства. Различие между
Public
Уровень доступа позволяет элементам быть видимыми и доступными вне определённого модуля (библиотеки или фреймворка), в котором они объявлены. Однако он ограничивает возможность наследования классов и переопределения методов в модулях, отличных от того, где класс или метод были первоначально объявлены. То есть, можно использовать
Open
Уровень доступа расширяет
Примеры:
Когда использовать
✅
✅
Выбор между
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 36%
open и public — это модификаторы доступа, которые определяют, как и где можно использовать классы, методы и свойства. Различие между
open и public важно понимать при проектировании API библиотек и фреймворков, так как оно влияет на возможности наследования и переопределения в модулях и подключаемых пакетах.Public
Уровень доступа позволяет элементам быть видимыми и доступными вне определённого модуля (библиотеки или фреймворка), в котором они объявлены. Однако он ограничивает возможность наследования классов и переопределения методов в модулях, отличных от того, где класс или метод были первоначально объявлены. То есть, можно использовать
public классы и методы в любом месте вашего проекта или в других проектах, которые импортируют ваш модуль, но вы не можете создавать подклассы или переопределять public методы за пределами их оригинального модуля.Open
Уровень доступа расширяет
public возможности, позволяя не только использовать классы и методы вне модуля, но и наследовать классы, а также переопределить методы в подклассах, находящихся вне модуля, где был объявлен оригинальный класс. Он является наиболее гибким уровнем доступа и должен использоваться с осторожностью, так как он предоставляет внешним модулям возможность изменять поведение вашего кода.Примеры:
// В модуле A
public class PublicClass {
public var property: Int = 0
public func method() {}
}
open class OpenClass {
open var property: Int = 0
open func method() {}
}
// В модуле B, который импортирует модуль A
class SubclassOfPublicClass: PublicClass {
// Это будет ошибка, если попытаться переопределить property или method
}
class SubclassOfOpenClass: OpenClass {
// Это разрешено: можно переопределить property и method
}
Когда использовать
✅
public, когда хотите разрешить использование классов, методов или свойств вне вашего модуля, но не хотите разрешать их наследование или переопределение.✅
open, когда предоставляете API, который специально предназначен для наследования и переопределения в клиентском коде, включая код вне модуля.Выбор между
open и public влияет на архитектуру и возможности расширения вашего кода. Open предоставляет большую гибкость для пользователей вашего API, но требует более тщательного проектирования и документирования, чтобы обеспечить безопасное наследование и переопределение.👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤11👍1
Привет, я Леха. Вопросы собеседований берутся с моего сайта easyoffer.ru. Его я делал как пет-проект, чтобы устроиться на работу, но сейчас проект уже перерастает в стартап и я пишу об этом в своем TG блоге Идущий к IT и на YouTube.
Об этом писал в статье на Habr
➖ Если нашли ошибку в посте пишите @aurumsunset
➖ Если хотите купить рекламу на канале пишите @easyoffer_adv
➖ Чтобы получить доступ к приватной группе, где мы выкладываем реальные записи собеседований переходите в бота
➖ Аналогично для тестовых заданий вот этот бот
"Как считается вероятность вопросов?"
Об этом писал в статье на Habr
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
Swift | Вопросы собесов pinned «Привет, я Леха. Вопросы собеседований берутся с моего сайта easyoffer.ru. Его я делал как пет-проект, чтобы устроиться на работу, но сейчас проект уже перерастает в стартап и я пишу об этом в своем TG блоге Идущий к IT и на YouTube. "Как считается вероятность…»
👾 823 вопросов собесов на Swift Developer
🔒 База реальных собесов
🔒 База тестовых заданий
👾 Список менторов
👩💻 Swift
├ Вакансии
├ LeetCode ответы
└ Тесты
👣 Golang
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
👩💻 С/С++
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
👩💻 PHP
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
🖥 Frontend
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
🖥 Тестировщик
├ Вопросы собесов
├ Вакансии
└ Тесты
🖥 Python
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
👩💻 Java
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
👩💻 Kotlin
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
👩💻 С#
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
🖥 Data Science
├ Вопросы собесов
├ Вакансии
└ Тесты
👩💻 DevOps
├ Вопросы собесов
├ Вакансии
└ Тесты
⚙ Backend
└ Вопросы собесов
👾 Список менторов
├ Вакансии
├ LeetCode ответы
└ Тесты
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
├ Вопросы собесов
├ Вакансии
└ Тесты
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
├ Вопросы собесов
├ Вакансии
├ LeetCode ответы
└ Тесты
├ Вопросы собесов
├ Вакансии
└ Тесты
├ Вопросы собесов
├ Вакансии
└ Тесты
└ Вопросы собесов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4
Какое самое главное различие между UI vue и CL vue ?
Спросят с вероятностью 27%
Основное различие между UIView и CLView заключается в том, что
Если же второй термин (
✅`CALayer`: Не является вью, но тесно связан с
✅`UIViewController`: Не является вью, но управляет представлением, доступ к которому осуществляется через свойство
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 27%
Основное различие между UIView и CLView заключается в том, что
CLView не существует в стандартной библиотеке UIKit или любых других известных библиотеках Apple для разработки под iOS или macOS. UIView является фундаментальным классом для пользовательских интерфейсов в iOS и tvOS, представляющим собой прямоугольную область, на которую можно наносить графику и с которой может взаимодействовать пользователь. Он служит основой для всех визуальных компонентов в приложении, таких как кнопки, лейблы, слайдеры и т.д. UIView также предоставляет базовые возможности для анимации, трансформации и многих других видов визуальных эффектов.Если же второй термин (
CLView) предполагался как сокращение или опечатка, вот несколько возможных объяснений:✅`CALayer`: Не является вью, но тесно связан с
UIView. Каждый UIView автоматически имеет связанный с ним CALayer, который отвечает за рендеринг содержимого UIView. CALayer предоставляет низкоуровневую модель для всех типов анимаций и визуальных эффектов. Разработчики могут напрямую взаимодействовать с слоями для создания сложных анимаций и трансформаций.✅`UIViewController`: Не является вью, но управляет представлением, доступ к которому осуществляется через свойство
view. UIViewController отвечает за загрузку, представление, и управление вью в приложении, а также за взаимодействие между моделью данных приложения и его представлением.UIView играет центральную роль в построении пользовательских интерфейсов, в то время как упоминание о CLView может быть результатом недопонимания или опечатки. Важно чётко понимать, к каким элементам относятся ваши вопросы или задачи, для корректного использования их в разработке.👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
😁9👀5🤯2❤1
За что отвечает "L" в "SOLID" ?
Спросят с вероятностью 18%
Буква "L" означает Принцип подстановки Лисков (Liskov Substitution Principle, LSP). Этот принцип был введен Барбарой Лисков в 1987 году в её конференц-докладе "Data abstraction and hierarchy".
Принцип подстановки Лисков
Гласит, что объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы. Это значит, что классы, создающие объекты, должны использовать интерфейсы своих базовых классов таким образом, чтобы не нарушать работу программы при замене объектов базового класса на объекты производного класса.
Рассмотрим пример с классами "Птица" и "Утка", где "Утка" является подклассом "Птицы". Если в классе "Птица" есть метод "летать()", и мы попытаемся вызвать этот метод для объекта класса "Пингвин" (который также является подклассом "Птицы"), но пингвины не умеют летать, то это будет нарушением LSP. В данном случае использование интерфейса "Птица" для "Пингвина" приводит к неправильному поведению.
Как его соблюдать
1️⃣Подклассы не должны изменять поведение базового класса: Подклассы не должны переопределять реализованные методы базового класса таким образом, чтобы изменить их поведение в контексте, который предполагается базовым классом.
2️⃣Не должно быть необходимости проверять типы подклассов: Клиентский код, работающий с базовым классом, не должен включать проверки типов подклассов для корректной работы.
3️⃣Используйте контракты: Для обеспечения соблюдения LSP можно использовать контракты (например, предусловия и постусловия) для методов, чтобы явно указать, как должны вести себя подклассы.
Соблюдение принципа подстановки Лисков помогает обеспечить гибкость и масштабируемость архитектуры ПО, позволяя безопасно использовать полиморфизм и наследование для расширения и модификации функциональности программ без неожиданных побочных эффектов.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Буква "L" означает Принцип подстановки Лисков (Liskov Substitution Principle, LSP). Этот принцип был введен Барбарой Лисков в 1987 году в её конференц-докладе "Data abstraction and hierarchy".
Принцип подстановки Лисков
Гласит, что объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы. Это значит, что классы, создающие объекты, должны использовать интерфейсы своих базовых классов таким образом, чтобы не нарушать работу программы при замене объектов базового класса на объекты производного класса.
Рассмотрим пример с классами "Птица" и "Утка", где "Утка" является подклассом "Птицы". Если в классе "Птица" есть метод "летать()", и мы попытаемся вызвать этот метод для объекта класса "Пингвин" (который также является подклассом "Птицы"), но пингвины не умеют летать, то это будет нарушением LSP. В данном случае использование интерфейса "Птица" для "Пингвина" приводит к неправильному поведению.
Как его соблюдать
1️⃣Подклассы не должны изменять поведение базового класса: Подклассы не должны переопределять реализованные методы базового класса таким образом, чтобы изменить их поведение в контексте, который предполагается базовым классом.
2️⃣Не должно быть необходимости проверять типы подклассов: Клиентский код, работающий с базовым классом, не должен включать проверки типов подклассов для корректной работы.
3️⃣Используйте контракты: Для обеспечения соблюдения LSP можно использовать контракты (например, предусловия и постусловия) для методов, чтобы явно указать, как должны вести себя подклассы.
Соблюдение принципа подстановки Лисков помогает обеспечить гибкость и масштабируемость архитектуры ПО, позволяя безопасно использовать полиморфизм и наследование для расширения и модификации функциональности программ без неожиданных побочных эффектов.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤7👍2
Привет, ребят, хочу сделать так, чтобы для каждого вопроса было поясняющее видео в reels/shorts формате.
Ищу человека который с этим поможет, работу оплачу. Вопросы есть, нужен простой монтаж и озвучка. Все видосы делаются по шаблону.
Если интересует такая подработка напишите мне @kivaiko
Ищу человека который с этим поможет, работу оплачу. Вопросы есть, нужен простой монтаж и озвучка. Все видосы делаются по шаблону.
Если интересует такая подработка напишите мне @kivaiko
👍15
Сколько может быть куч и стеков в приложении ?
Спросят с вероятностью 27%
В операционных системах, используемых для запуска приложений, обычно используется понятие одной кучи (heap) и множества стеков (stack) для управления памятью. Их количество зависит от модели выполнения приложения, в частности, от количества потоков, которые оно использует.
Куча
Как правило, в приложении используется одна куча для динамического распределения памяти. Эта область памяти используется для выделения и освобождения памяти во время выполнения программы, например, при создании объектов в куче (в языках программирования высокого уровня, таких как C#, Java, Python, Swift и других). Однако, в зависимости от реализации операционной системы и среды выполнения, может существовать несколько куч:
✅Общая куча (Global Heap): Используется всеми потоками приложения.
✅Приватные/локальные кучи: Операционные системы или среды выполнения могут предоставлять возможность создавать отдельные кучи для использования определёнными частями приложения или для управления специфическими типами данных.
Стек
Для каждого потока выполнения в приложении выделяется отдельный стек. Он используется для хранения локальных переменных функций, параметров вызовов и информации о контексте выполнения (например, адреса возврата для функций). Это означает, что если у вас есть приложение с N потоками, то в вашем приложении будет N стеков.
✅Основной поток (Main Thread): Имеет свой стек.
✅Рабочие потоки (Worker Threads): Каждый из них имеет свой стек.
✅Куча: Обычно одна на приложение, но могут быть случаи, когда используется несколько куч (например, для управления разными типами ресурсов или в многопоточных приложениях с приватными кучами для каждого потока).
✅Стек: Один на каждый поток выполнения в приложении.
Точное количество куч и стеков зависит от архитектуры приложения, используемых библиотек и операционной системы. В многопоточных приложениях число стеков соответствует числу потоков, а управление несколькими кучами может потребоваться для оптимизации работы с памятью или для удовлетворения специфических требований к безопасности или изоляции данных.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 27%
В операционных системах, используемых для запуска приложений, обычно используется понятие одной кучи (heap) и множества стеков (stack) для управления памятью. Их количество зависит от модели выполнения приложения, в частности, от количества потоков, которые оно использует.
Куча
Как правило, в приложении используется одна куча для динамического распределения памяти. Эта область памяти используется для выделения и освобождения памяти во время выполнения программы, например, при создании объектов в куче (в языках программирования высокого уровня, таких как C#, Java, Python, Swift и других). Однако, в зависимости от реализации операционной системы и среды выполнения, может существовать несколько куч:
✅Общая куча (Global Heap): Используется всеми потоками приложения.
✅Приватные/локальные кучи: Операционные системы или среды выполнения могут предоставлять возможность создавать отдельные кучи для использования определёнными частями приложения или для управления специфическими типами данных.
Стек
Для каждого потока выполнения в приложении выделяется отдельный стек. Он используется для хранения локальных переменных функций, параметров вызовов и информации о контексте выполнения (например, адреса возврата для функций). Это означает, что если у вас есть приложение с N потоками, то в вашем приложении будет N стеков.
✅Основной поток (Main Thread): Имеет свой стек.
✅Рабочие потоки (Worker Threads): Каждый из них имеет свой стек.
✅Куча: Обычно одна на приложение, но могут быть случаи, когда используется несколько куч (например, для управления разными типами ресурсов или в многопоточных приложениях с приватными кучами для каждого потока).
✅Стек: Один на каждый поток выполнения в приложении.
Точное количество куч и стеков зависит от архитектуры приложения, используемых библиотек и операционной системы. В многопоточных приложениях число стеков соответствует числу потоков, а управление несколькими кучами может потребоваться для оптимизации работы с памятью или для удовлетворения специфических требований к безопасности или изоляции данных.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤8🔥3
Какая разница между semaphore и mutex ?
Спросят с вероятностью 18%
Семафоры и мьютексы (mutexes) используются для синхронизации доступа к ресурсам. Хотя оба этих инструмента обеспечивают средства контроля за доступом к ресурсам, они имеют различные цели и реализации.
Mutex (Мьютекс)
Это примитив синхронизации, который позволяет защищать критические секции кода так, чтобы только один поток мог выполнять этот код в данный момент времени.
Ключевые особенности:
✅Взаимное исключение: Гарантирует, что только один поток может владеть мьютексом в любой момент времени. Это обеспечивает взаимное исключение доступа к ресурсу или критической секции.
✅Владение: Должен быть освобожден тем же потоком, который его захватил.
✅Блокировка: Если мьютекс занят, другие потоки, пытающиеся захватить его, будут заблокированы до тех пор, пока он не будет освобожден.
Semaphore (Семафор)
Используется для управления доступом к ограниченному числу ресурсов. Он может быть настроен так, чтобы позволять доступ нескольким потокам одновременно.
Ключевые особенности:
✅Счётчик: Управляется с помощью счётчика, который указывает количество доступных ресурсов или разрешений.
✅Гибкость: Могут быть использованы для регулирования доступа к нескольким экземплярам ресурса, в то время как мьютексы всегда предназначены только для одного ресурса.
✅Блокировка и освобождение: Когда поток запрашивает семафор, счётчик уменьшается. Когда поток освобождает семафор, счётчик увеличивается. Если счётчик равен нулю, потоки будут заблокированы до его освобождения.
Отличия и когда использовать
✅Использование мьютекса: Если нужно защитить критическую секцию кода или ресурс, к которому должен иметь доступ только один поток одновременно, используйте мьютекс. Это обеспечивает строгое взаимное исключение.
✅Использование семафора: Если у вас есть ограниченное число однотипных ресурсов, которыми могут одновременно пользоваться несколько потоков (например, соединения с базой данных или слоты ограниченной емкости), семафор является подходящим инструментом.
Использование мьютексов и семафоров требует аккуратности, чтобы избежать проблем, таких как взаимные блокировки (deadlocks) и гонки за ресурсы (race conditions). Эти инструменты являются фундаментальными для обеспечения надежной и эффективной многопоточности в приложениях.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Семафоры и мьютексы (mutexes) используются для синхронизации доступа к ресурсам. Хотя оба этих инструмента обеспечивают средства контроля за доступом к ресурсам, они имеют различные цели и реализации.
Mutex (Мьютекс)
Это примитив синхронизации, который позволяет защищать критические секции кода так, чтобы только один поток мог выполнять этот код в данный момент времени.
Ключевые особенности:
✅Взаимное исключение: Гарантирует, что только один поток может владеть мьютексом в любой момент времени. Это обеспечивает взаимное исключение доступа к ресурсу или критической секции.
✅Владение: Должен быть освобожден тем же потоком, который его захватил.
✅Блокировка: Если мьютекс занят, другие потоки, пытающиеся захватить его, будут заблокированы до тех пор, пока он не будет освобожден.
Semaphore (Семафор)
Используется для управления доступом к ограниченному числу ресурсов. Он может быть настроен так, чтобы позволять доступ нескольким потокам одновременно.
Ключевые особенности:
✅Счётчик: Управляется с помощью счётчика, который указывает количество доступных ресурсов или разрешений.
✅Гибкость: Могут быть использованы для регулирования доступа к нескольким экземплярам ресурса, в то время как мьютексы всегда предназначены только для одного ресурса.
✅Блокировка и освобождение: Когда поток запрашивает семафор, счётчик уменьшается. Когда поток освобождает семафор, счётчик увеличивается. Если счётчик равен нулю, потоки будут заблокированы до его освобождения.
Отличия и когда использовать
✅Использование мьютекса: Если нужно защитить критическую секцию кода или ресурс, к которому должен иметь доступ только один поток одновременно, используйте мьютекс. Это обеспечивает строгое взаимное исключение.
✅Использование семафора: Если у вас есть ограниченное число однотипных ресурсов, которыми могут одновременно пользоваться несколько потоков (например, соединения с базой данных или слоты ограниченной емкости), семафор является подходящим инструментом.
Использование мьютексов и семафоров требует аккуратности, чтобы избежать проблем, таких как взаимные блокировки (deadlocks) и гонки за ресурсы (race conditions). Эти инструменты являются фундаментальными для обеспечения надежной и эффективной многопоточности в приложениях.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍7
Как можно решить проблему с долгой необоснованной прогрузкой картинок ?
Спросят с вероятностью 18%
Проблема долгой загрузки изображений может существенно повлиять на пользовательский опыт, особенно в веб-приложениях и мобильных приложениях, где скорость отклика и производительность являются критически важными. Вот несколько стратегий, которые можно использовать для решения этой проблемы:
1️⃣Оптимизация изображений
Сжатие изображений: Уменьшение размера файлов изображений без значительной потери качества может значительно ускорить их загрузку. Используйте форматы файлов, такие как JPEG для фотографий или PNG для изображений с прозрачностью, и инструменты сжатия.
Адаптация размера изображений: Не отправляйте изображения размером больше, чем необходимо. Изображения должны быть адаптированы к разрешению экрана устройства пользователя.
2️⃣Использование кеширования
Кеширование браузера: Убедитесь, что HTTP-заголовки кеширования настроены правильно, чтобы браузеры могли сохранять изображения в кеше. Это уменьшит количество загрузок тех же изображений при повторных посещениях.
Серверное кеширование: Использование обратных прокси-серверов или CDN (сетей доставки контента) может помочь кешировать статический контент ближе к пользователю, сокращая время загрузки.
3️⃣Ленивая загрузка (Lazy Loading)
Загружает контент по мере необходимости, когда он находится в области просмотра, а не сразу все изображения на странице. Это может значительно ускорить время загрузки страницы и уменьшить использование данных.
4️⃣Использование современных форматов изображений
Предлагают лучшее сжатие и качество по сравнению с традиционными форматами, может значительно уменьшить размер файлов.
5️⃣Предзагрузка ресурсов
Если вы знаете, что пользователь скорее всего будет нуждаться в определенных изображениях в процессе навигации, можно использовать предзагрузку (Preloading). Это указание браузеру заранее загрузить определенные ресурсы, которые скоро понадобятся.
6️⃣Использование CDN
Размещает ваш контент на множестве серверов по всему миру, что уменьшает латентность, ускоряя загрузку ресурсов благодаря физической близости к пользователю.
7️⃣Мониторинг производительности
Регулярно проверяйте и анализируйте производительность загрузки ваших изображений с помощью инструментов, таких как Google PageSpeed Insights, Lighthouse и других. Это поможет вам идентифицировать проблемные области и отслеживать эффективность внедренных улучшений.
Применение одной или нескольких из этих стратегий должно помочь улучшить время загрузки изображений и, как результат, улучшить общий пользовательский опыт и производительность вашего приложения или сайта.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Проблема долгой загрузки изображений может существенно повлиять на пользовательский опыт, особенно в веб-приложениях и мобильных приложениях, где скорость отклика и производительность являются критически важными. Вот несколько стратегий, которые можно использовать для решения этой проблемы:
1️⃣Оптимизация изображений
Сжатие изображений: Уменьшение размера файлов изображений без значительной потери качества может значительно ускорить их загрузку. Используйте форматы файлов, такие как JPEG для фотографий или PNG для изображений с прозрачностью, и инструменты сжатия.
Адаптация размера изображений: Не отправляйте изображения размером больше, чем необходимо. Изображения должны быть адаптированы к разрешению экрана устройства пользователя.
2️⃣Использование кеширования
Кеширование браузера: Убедитесь, что HTTP-заголовки кеширования настроены правильно, чтобы браузеры могли сохранять изображения в кеше. Это уменьшит количество загрузок тех же изображений при повторных посещениях.
Серверное кеширование: Использование обратных прокси-серверов или CDN (сетей доставки контента) может помочь кешировать статический контент ближе к пользователю, сокращая время загрузки.
3️⃣Ленивая загрузка (Lazy Loading)
Загружает контент по мере необходимости, когда он находится в области просмотра, а не сразу все изображения на странице. Это может значительно ускорить время загрузки страницы и уменьшить использование данных.
4️⃣Использование современных форматов изображений
Предлагают лучшее сжатие и качество по сравнению с традиционными форматами, может значительно уменьшить размер файлов.
5️⃣Предзагрузка ресурсов
Если вы знаете, что пользователь скорее всего будет нуждаться в определенных изображениях в процессе навигации, можно использовать предзагрузку (Preloading). Это указание браузеру заранее загрузить определенные ресурсы, которые скоро понадобятся.
6️⃣Использование CDN
Размещает ваш контент на множестве серверов по всему миру, что уменьшает латентность, ускоряя загрузку ресурсов благодаря физической близости к пользователю.
7️⃣Мониторинг производительности
Регулярно проверяйте и анализируйте производительность загрузки ваших изображений с помощью инструментов, таких как Google PageSpeed Insights, Lighthouse и других. Это поможет вам идентифицировать проблемные области и отслеживать эффективность внедренных улучшений.
Применение одной или нескольких из этих стратегий должно помочь улучшить время загрузки изображений и, как результат, улучшить общий пользовательский опыт и производительность вашего приложения или сайта.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍4🤯2🤔1
В чем заключается суть оптимизации ?
Спросят с вероятностью 18%
Оптимизация — это процесс улучшения кода для достижения более эффективного исполнения, обычно в контексте улучшения производительности, уменьшения занимаемого ресурсами места или увеличения эффективности работы с памятью. Этот процесс может касаться разных аспектов приложения, включая время выполнения, потребление памяти, управление базами данных, взаимодействие с сетью и пользовательский интерфейс.
Цели:
1️⃣Улучшение производительности: Снижение времени, необходимого для выполнения определённых операций, что может включать оптимизацию алгоритмов, уменьшение количества обращений к базе данных или использование более эффективных методов обработки данных.
2️⃣Сокращение потребления ресурсов: Уменьшение объёма используемой оперативной памяти, дискового пространства или пропускной способности сети. Это может быть критически важно для приложений, работающих на устройствах с ограниченными ресурсами, например, на мобильных устройствах.
3️⃣Энергоэффективность: Особенно важна для мобильных и встроенных систем, где сокращение потребления энергии может привести к увеличению времени работы от батареи.
4️⃣Улучшение масштабируемости: Оптимизация программного обеспечения для обработки большего количества задач параллельно или обслуживания большего числа пользователей одновременно.
5️⃣Улучшение удобства пользователя: Сокращение времени отклика приложения на действия пользователя, что делает интерфейс более отзывчивым и приятным в использовании.
Методы:
1️⃣Профилирование: Использование специальных инструментов для анализа, где приложение проводит больше всего времени или потребляет больше всего ресурсов. Это помогает идентифицировать "узкие места" и приоритизировать усилия по оптимизации.
2️⃣Оптимизация алгоритмов: Замена медленных алгоритмов на более быстрые и эффективные. Например, использование хеш-таблиц вместо списков для быстрого поиска данных.
3️⃣Асинхронное программирование: Использование асинхронных операций для улучшения отклика приложения, позволяя пользовательскому интерфейсу оставаться отзывчивым во время выполнения длительных операций.
4️⃣Минимизация зависимостей: Уменьшение зависимостей от внешних библиотек и сервисов, которые могут замедлять загрузку или выполнение приложения.
5️⃣Избегание избыточности: Удаление повторяющихся или ненужных операций в коде.
При оптимизации важно соблюдать баланс между улучшением производительности и сохранением читаемости и поддерживаемости кода. Оптимизация "до абсурда" может привести к тому, что код станет трудночитаемым и трудно поддерживаемым. Всегда полезно помнить о принципе "прематурная оптимизация — корень всех зол", который предостерегает от чрезмерного фокуса на оптимизации на ранних этапах разработки в ущерб функциональности и архитектуре ПО.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Оптимизация — это процесс улучшения кода для достижения более эффективного исполнения, обычно в контексте улучшения производительности, уменьшения занимаемого ресурсами места или увеличения эффективности работы с памятью. Этот процесс может касаться разных аспектов приложения, включая время выполнения, потребление памяти, управление базами данных, взаимодействие с сетью и пользовательский интерфейс.
Цели:
1️⃣Улучшение производительности: Снижение времени, необходимого для выполнения определённых операций, что может включать оптимизацию алгоритмов, уменьшение количества обращений к базе данных или использование более эффективных методов обработки данных.
2️⃣Сокращение потребления ресурсов: Уменьшение объёма используемой оперативной памяти, дискового пространства или пропускной способности сети. Это может быть критически важно для приложений, работающих на устройствах с ограниченными ресурсами, например, на мобильных устройствах.
3️⃣Энергоэффективность: Особенно важна для мобильных и встроенных систем, где сокращение потребления энергии может привести к увеличению времени работы от батареи.
4️⃣Улучшение масштабируемости: Оптимизация программного обеспечения для обработки большего количества задач параллельно или обслуживания большего числа пользователей одновременно.
5️⃣Улучшение удобства пользователя: Сокращение времени отклика приложения на действия пользователя, что делает интерфейс более отзывчивым и приятным в использовании.
Методы:
1️⃣Профилирование: Использование специальных инструментов для анализа, где приложение проводит больше всего времени или потребляет больше всего ресурсов. Это помогает идентифицировать "узкие места" и приоритизировать усилия по оптимизации.
2️⃣Оптимизация алгоритмов: Замена медленных алгоритмов на более быстрые и эффективные. Например, использование хеш-таблиц вместо списков для быстрого поиска данных.
3️⃣Асинхронное программирование: Использование асинхронных операций для улучшения отклика приложения, позволяя пользовательскому интерфейсу оставаться отзывчивым во время выполнения длительных операций.
4️⃣Минимизация зависимостей: Уменьшение зависимостей от внешних библиотек и сервисов, которые могут замедлять загрузку или выполнение приложения.
5️⃣Избегание избыточности: Удаление повторяющихся или ненужных операций в коде.
При оптимизации важно соблюдать баланс между улучшением производительности и сохранением читаемости и поддерживаемости кода. Оптимизация "до абсурда" может привести к тому, что код станет трудночитаемым и трудно поддерживаемым. Всегда полезно помнить о принципе "прематурная оптимизация — корень всех зол", который предостерегает от чрезмерного фокуса на оптимизации на ранних этапах разработки в ущерб функциональности и архитектуре ПО.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Что такое ARC ?
Спросят с вероятностью 27%
ARC, или Automatic Reference Counting — это система управления памятью. Он автоматически отслеживает и управляет жизненным циклом объектов в памяти, освобождая разработчика от необходимости вручную увеличивать или уменьшать счетчик ссылок на объекты.
В языках программирования,объекты остаются в памяти до тех пор, пока на них существуют активные ссылки. Когда количество ссылок на объект уменьшается до нуля, это означает, что объект больше не используется, и система может освободить занимаемую им память.
Как он работает:
✅Увеличение счетчика ссылок: Каждый раз, когда вы создаете новую сильную ссылку (strong reference) на объект (например, присваивая объект переменной или свойству), ARC автоматически увеличивает счетчик ссылок на этот объект.
✅Уменьшение счетчика ссылок: Когда сильная ссылка на объект уничтожается (например, когда переменная выходит из области видимости или ей присваивается значение
✅Освобождение памяти: Когда счетчик ссылок на объект достигает нуля, ARC автоматически освобождает память, занимаемую этим объектом.
ARC и управление циклическими ссылками:
Одной из проблем, которую нужно решать при использовании ARC, является возможность возникновения циклических ссылок, когда два объекта ссылаются друг на друга сильными ссылками. Это может привести к тому, что счетчик ссылок на оба объекта никогда не достигнет нуля, и память, занимаемая этими объектами, не будет освобождена.
Для решения этой проблемы предлагается два типа ссылок, которые не увеличивают счетчик ссылок:
✅weak: Слабые ссылки (
✅unowned: Несильные ссылки (
ARC значительно упрощает управление памятью в приложениях, автоматизируя большую часть процесса, но требует от разработчиков понимания работы сильных, слабых и несильных ссылок для предотвращения утечек памяти и ошибок времени выполнения.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 27%
ARC, или Automatic Reference Counting — это система управления памятью. Он автоматически отслеживает и управляет жизненным циклом объектов в памяти, освобождая разработчика от необходимости вручную увеличивать или уменьшать счетчик ссылок на объекты.
В языках программирования,объекты остаются в памяти до тех пор, пока на них существуют активные ссылки. Когда количество ссылок на объект уменьшается до нуля, это означает, что объект больше не используется, и система может освободить занимаемую им память.
Как он работает:
✅Увеличение счетчика ссылок: Каждый раз, когда вы создаете новую сильную ссылку (strong reference) на объект (например, присваивая объект переменной или свойству), ARC автоматически увеличивает счетчик ссылок на этот объект.
✅Уменьшение счетчика ссылок: Когда сильная ссылка на объект уничтожается (например, когда переменная выходит из области видимости или ей присваивается значение
nil), ARC уменьшает счетчик ссылок на объект.✅Освобождение памяти: Когда счетчик ссылок на объект достигает нуля, ARC автоматически освобождает память, занимаемую этим объектом.
ARC и управление циклическими ссылками:
Одной из проблем, которую нужно решать при использовании ARC, является возможность возникновения циклических ссылок, когда два объекта ссылаются друг на друга сильными ссылками. Это может привести к тому, что счетчик ссылок на оба объекта никогда не достигнет нуля, и память, занимаемая этими объектами, не будет освобождена.
Для решения этой проблемы предлагается два типа ссылок, которые не увеличивают счетчик ссылок:
✅weak: Слабые ссылки (
weak) не увеличивают счетчик ссылок и автоматически становятся nil, когда объект уничтожается. Они обычно используются для предотвращения циклических ссылок, когда объекты могут быть уничтожены в любой момент.✅unowned: Несильные ссылки (
unowned) похожи на слабые, но предполагают, что другой объект будет иметь тот же срок жизни или более долгий срок жизни. unowned ссылки не становятся nil и могут привести к ошибкам времени выполнения, если вы попытаетесь получить доступ к объекту, который уже был освобожден.ARC значительно упрощает управление памятью в приложениях, автоматизируя большую часть процесса, но требует от разработчиков понимания работы сильных, слабых и несильных ссылок для предотвращения утечек памяти и ошибок времени выполнения.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍5
Какие есть два типа инициализаторов ?
Спросят с вероятностью 27%
Существуют два основных типа инициализаторов: обозначенные (Designated) и вспомогательные (Convenience). Эти типы инициализаторов играют важную роль в процессе инициализации экземпляров классов, помогая управлять процессом создания объектов с корректным начальным состоянием.
Обозначенные инициализаторы (Designated Initializers)
Являются основными инициализаторами класса. Они полностью инициализируют все свойства, введённые классом, и вызывают соответствующий инициализатор суперкласса, чтобы продолжить процесс инициализации вверх по иерархии наследования.
Каждый класс должен иметь хотя бы один обозначенный инициализатор. В некоторых случаях это может быть инициализатор, унаследованный от суперкласса.
Пример:
Вспомогательные инициализаторы (Convenience Initializers)
Являются второстепенными, удобными инициализаторами, которые можно определить в классе для предоставления дополнительных опций для создания экземпляра класса, используя некоторые значения по умолчанию или другую простую логику инициализации. Вспомогательные инициализаторы всегда вызывают обозначенный инициализатор того же класса (непосредственно или косвенно), обеспечивая таким образом полную инициализацию объекта.
Пример:
Здесь
Ключевые отличия
✅Обязанности: Обозначенные инициализаторы несут ответственность за полную инициализацию всех свойств, введённых классом, а также за вызов соответствующего инициализатора суперкласса. Вспомогательные инициализаторы не обязаны напрямую инициализировать все свойства, они обычно предоставляют альтернативный или упрощённый способ инициализации.
✅Вызовы: Вспомогательные инициализаторы всегда вызывают обозначенный инициализатор того же класса, в то время как обозначенные инициализаторы могут вызывать инициализаторы своего суперкласса.
Понимание этих двух типов инициализаторов важно для корректной инициализации объектов, особенно при работе с наследованием и расширением классов.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 27%
Существуют два основных типа инициализаторов: обозначенные (Designated) и вспомогательные (Convenience). Эти типы инициализаторов играют важную роль в процессе инициализации экземпляров классов, помогая управлять процессом создания объектов с корректным начальным состоянием.
Обозначенные инициализаторы (Designated Initializers)
Являются основными инициализаторами класса. Они полностью инициализируют все свойства, введённые классом, и вызывают соответствующий инициализатор суперкласса, чтобы продолжить процесс инициализации вверх по иерархии наследования.
Каждый класс должен иметь хотя бы один обозначенный инициализатор. В некоторых случаях это может быть инициализатор, унаследованный от суперкласса.
Пример:
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
В этом примере init(name: String, age: Int) является обозначенным инициализатором для класса Person, который инициализирует все свойства класса.Вспомогательные инициализаторы (Convenience Initializers)
Являются второстепенными, удобными инициализаторами, которые можно определить в классе для предоставления дополнительных опций для создания экземпляра класса, используя некоторые значения по умолчанию или другую простую логику инициализации. Вспомогательные инициализаторы всегда вызывают обозначенный инициализатор того же класса (непосредственно или косвенно), обеспечивая таким образом полную инициализацию объекта.
Пример:
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
convenience init() {
self.init(name: "Unknown", age: 0)
}
}Здесь
convenience init() является вспомогательным инициализатором, который предоставляет возможность создать экземпляр Person с некоторыми значениями по умолчанию.Ключевые отличия
✅Обязанности: Обозначенные инициализаторы несут ответственность за полную инициализацию всех свойств, введённых классом, а также за вызов соответствующего инициализатора суперкласса. Вспомогательные инициализаторы не обязаны напрямую инициализировать все свойства, они обычно предоставляют альтернативный или упрощённый способ инициализации.
✅Вызовы: Вспомогательные инициализаторы всегда вызывают обозначенный инициализатор того же класса, в то время как обозначенные инициализаторы могут вызывать инициализаторы своего суперкласса.
Понимание этих двух типов инициализаторов важно для корректной инициализации объектов, особенно при работе с наследованием и расширением классов.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
🔥7❤5👍4