Какой тип коллекций в 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
      
    Что такое deadlock ?
Спросят с вероятностью 27%
"deadlock" описывает ситуацию, при которой два или более процессов (или потоков) останавливаются, ожидая друг друга, чтобы освободить ресурсы или завершить выполнение. Каждый процесс занимает ресурс, который требуется другому процессу для продолжения работы, и ни один из них не может продолжить выполнение, так как ожидает освобождения ресурса другим процессом. Это приводит к заморозке всех участвующих процессов и, возможно, всей системы или приложения.
Как он возникает
Для его возникновения обычно должны быть выполнены четыре условия, называемые условиями Коффмана:
1️⃣Взаимное исключение — только один процесс может использовать ресурс в данный момент времени.
2️⃣Удержание и ожидание — процессы, удерживающие ресурсы, могут запрашивать новые ресурсы.
3️⃣Отсутствие прерывания — ресурсы не могут быть принудительно изъяты у процессов; процесс сам должен освободить ресурс.
4️⃣Циклическое ожидание — существует цикл в графе ожидания ресурсов, где каждый процесс дополнительно ожидает ресурс, занятый следующим в цикле.
Пример, который может привести к deadlock в многопоточном приложении:
В этом примере
Чтобы избежать deadlock, можно:
✅Использовать тайм-ауты при попытках захвата замков.
✅Убедиться, что все потоки захватывают замки в одном и том же порядке.
✅Использовать алгоритмы обнаружения deadlock и соответствующие стратегии восстановления.
Deadlock — это когда два компьютерных процесса не могут продолжить работу, потому что каждый ждет, пока другой освободит ресурс, который ему нужен. Это как два автомобиля, застрявшие на узкой дороге, где каждый не может проехать, пока другой не отъедет.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 27%
"deadlock" описывает ситуацию, при которой два или более процессов (или потоков) останавливаются, ожидая друг друга, чтобы освободить ресурсы или завершить выполнение. Каждый процесс занимает ресурс, который требуется другому процессу для продолжения работы, и ни один из них не может продолжить выполнение, так как ожидает освобождения ресурса другим процессом. Это приводит к заморозке всех участвующих процессов и, возможно, всей системы или приложения.
Как он возникает
Для его возникновения обычно должны быть выполнены четыре условия, называемые условиями Коффмана:
1️⃣Взаимное исключение — только один процесс может использовать ресурс в данный момент времени.
2️⃣Удержание и ожидание — процессы, удерживающие ресурсы, могут запрашивать новые ресурсы.
3️⃣Отсутствие прерывания — ресурсы не могут быть принудительно изъяты у процессов; процесс сам должен освободить ресурс.
4️⃣Циклическое ожидание — существует цикл в графе ожидания ресурсов, где каждый процесс дополнительно ожидает ресурс, занятый следующим в цикле.
Пример, который может привести к deadlock в многопоточном приложении:
var lockA = NSLock()
var lockB = NSLock()
func thread1() {
lockA.lock()
print("Thread 1 locked A")
sleep(1) // Даем время другому потоку захватить lockB
lockB.lock()
print("Thread 1 locked B")
lockB.unlock()
lockA.unlock()
}
func thread2() {
lockB.lock()
print("Thread 2 locked B")
sleep(1) // Даем время первому потоку захватить lockA
lockA.lock()
print("Thread 2 locked A")
lockA.unlock()
lockB.unlock()
}
DispatchQueue.global().async(execute: thread1)
DispatchQueue.global().async(execute: thread2)
В этом примере
thread1 и thread2 запускаются параллельно и пытаются получить два замка (lockA и lockB). Однако из-за временной задержки (sleep) каждый поток успевает захватить один замок и ожидает освобождения второго, который держит другой поток. Это ведет к взаимной блокировке.Чтобы избежать deadlock, можно:
✅Использовать тайм-ауты при попытках захвата замков.
✅Убедиться, что все потоки захватывают замки в одном и том же порядке.
✅Использовать алгоритмы обнаружения deadlock и соответствующие стратегии восстановления.
Deadlock — это когда два компьютерных процесса не могут продолжить работу, потому что каждый ждет, пока другой освободит ресурс, который ему нужен. Это как два автомобиля, застрявшие на узкой дороге, где каждый не может проехать, пока другой не отъедет.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤2
  Anonymous Quiz
    30%
    asyncAfter
      
    2%
    performSelector
      
    67%
    DispatchQueue.global().async
      
    0%
    NSTimer.scheduledTimer
      
    Какая ссылка производительнее: unowed или weak ?
Спросят с вероятностью 18%
Ссылки unowned и weak используются для управления сильными ссылочными циклами, когда два объекта держат друг друга сильными ссылками, что может привести к утечкам памяти, так как объекты не могут быть должным образом освобождены. Хотя обе эти ссылки не увеличивают счётчик ссылок объекта и помогают предотвратить сильные ссылочные циклы, они работают немного по-разному.
Сравнение weak и unowned
1️⃣`weak`
✅Используются, когда один объект может существовать без другого.
✅Пример: В UI программировании ссылка на делегат обычно объявляется как
2️⃣`unowned`
✅Используются, когда один объект всегда должен существовать, пока существует другой объект, указывающий на него. В отличие от
✅Пример: Если у вас есть класс, который гарантированно не будет использоваться после уничтожения своего владельца, то
Производительность
Выбор между
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Ссылки unowned и weak используются для управления сильными ссылочными циклами, когда два объекта держат друг друга сильными ссылками, что может привести к утечкам памяти, так как объекты не могут быть должным образом освобождены. Хотя обе эти ссылки не увеличивают счётчик ссылок объекта и помогают предотвратить сильные ссылочные циклы, они работают немного по-разному.
Сравнение weak и unowned
1️⃣`weak`
✅Используются, когда один объект может существовать без другого.
weak ссылка всегда является опциональной, и автоматически становится nil, когда объект, на который она указывает, уничтожается. Это делает weak ссылки безопасными с точки зрения времени выполнения, так как они явно показывают, что объект может отсутствовать.✅Пример: В UI программировании ссылка на делегат обычно объявляется как
weak, потому что делегат может быть освобожден в любой момент, и необязательно должен существовать весь жизненный цикл объекта, держащего ссылку.2️⃣`unowned`
✅Используются, когда один объект всегда должен существовать, пока существует другой объект, указывающий на него. В отличие от
weak, unowned ссылка не является опциональной и не обнуляется автоматически. Если вы попытаетесь получить доступ к unowned ссылке после того, как объект был уничтожен, это приведёт к ошибке времени выполнения (runtime crash).✅Пример: Если у вас есть класс, который гарантированно не будет использоваться после уничтожения своего владельца, то
unowned может быть более подходящим выбором.Производительность
unowned ссылки могут быть чуть более эффективными, поскольку они не требуют проверки на nil, что необходимо делать при каждом доступе к weak ссылке. Такие ссылки просто предполагают, что объект всегда существует, в то время как weak ссылки могут потребовать дополнительных операций для обработки случая, когда объект уже был уничтожен.Выбор между
unowned и weak должен основываться не только на соображениях производительности, но и на правильном управлении памятью и безопасности вашего кода. Если вы не уверены в том, что объект всегда будет существовать при доступе к нему, лучше использовать weak, чтобы избежать возможных ошибок времени выполнения. Если вы уверены, что объект не будет уничтожен раньше, чем владелец ссылки, unowned может быть более подходящим и немного более производительным выбором.👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍2
  В Swift существует несколько видов диспетчеризации, которые определяют, как и когда вызываются методы или функции. Основные виды диспетчеризации включают статическую диспетчеризацию (static dispatch), диспетчеризацию по таблице виртуальных функций (vtable dispatch), диспетчеризацию по свидетелю (witness table dispatch) и динамическую диспетчеризацию (dynamic dispatch). Рассмотрим их подробнее:
     struct MyStruct {
         func printMessage() {
             print("Hello from MyStruct")
         }
     }
     let instance = MyStruct()
     instance.printMessage() // Вызов определяется на этапе компиляции
          class BaseClass {
         func printMessage() {
             print("Hello from BaseClass")
         }
     }
     class SubClass: BaseClass {
         override func printMessage() {
             print("Hello from SubClass")
         }
     }
     let instance: BaseClass = SubClass()
     instance.printMessage() // Вызов определяется в runtime с использованием vtable
          protocol MyProtocol {
         func printMessage()
     }
     struct MyStruct: MyProtocol {
         func printMessage() {
             print("Hello from MyStruct")
         }
     }
     let instance: MyProtocol = MyStruct()
     instance.printMessage() // Вызов определяется в runtime с использованием witness table
     dynamic или методов Objective-C. Метод определяется в runtime с использованием Objective-C runtime.import Foundation
class MyClass: NSObject {
@objc dynamic func printMessage() {
print("Hello from MyClass")
}
}
let instance = MyClass()
instance.printMessage() // Вызов определяется в runtime с использованием Objective-C runtime
В Swift существуют различные виды диспетчеризации: статическая, диспетчеризация по таблице виртуальных функций, диспетчеризация по свидетелю и динамическая диспетчеризация. Каждый вид используется в зависимости от структуры и требований кода.
В двух фразах: В Swift есть статическая и динамическая диспетчеризация, а также диспетчеризация через vtable и witness table. Они определяют, как и когда вызываются методы, обеспечивая гибкость и производительность.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  Кто последний может обработать кнопку в иерархией вьюшек ?
Спросят с вероятностью 18%
Обработка событий, таких как нажатия на кнопку, зависит от иерархии представлений (view hierarchy) и реализации методов обработки событий в этих представлениях. Ответ на вопрос, кто последний может обработать нажатие кнопки в иерархии вьюшек, определяется несколькими ключевыми аспектами UIKit.
Понимание Responder Chain
В UIKit все представления (views) и контроллеры (view controllers) являются частью так называемой цепочки обработчиков (responder chain), которая определяет, как объекты в приложении реагируют на события пользовательского ввода, такие как касания, жесты или движения. Цепочка респондеров следует по иерархии представлений от первого респондера к следующим объектам в иерархии, пока событие не будет обработано или пока не будут исчерпаны все возможные респондеры.
Как она проходит
1️⃣Начальная точка: Обычно, когда происходит нажатие на кнопку, система сначала пытается определить, какой view в иерархии непосредственно получил касание. Это view становится первым респондером для события.
2️⃣Восходящая передача: Если view (или кнопка) решает, что она не будет обрабатывать событие, событие передается его родительскому view. Этот процесс продолжается вверх по иерархии view, пока не будет найден подходящий обработчик или пока событие не достигнет корневого view.
3️⃣Контроллеры представления: Если ни один из view не обработал событие, событие передается контроллеру представления, который управляет текущим view.
4️⃣Дополнительные обработчики: Если контроллер представления также не обрабатывает событие, оно может быть передано дальше другим контроллерам или объектам, таким как UIWindow или UIApplication, и, в конечном счете, AppDelegate.
Исключительная ситуация
Однако, если какой-то из объектов в цепочке респондеров переопределяет метод обработки и возвращает, что он обработал событие, обработка события прекращается, и оно не распространяется дальше по цепочке.
Если никакой из view или контроллеров в иерархии не обработает событие, последними потенциальными обработчиками будут объекты на уровне приложения, такие как UIWindow или UIApplication, и в крайнем случае AppDelegate. В стандартной ситуации обычно ожидается, что событие будет обработано на уровне view или контроллера представления, но возможность распространения до самого верха существует.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Обработка событий, таких как нажатия на кнопку, зависит от иерархии представлений (view hierarchy) и реализации методов обработки событий в этих представлениях. Ответ на вопрос, кто последний может обработать нажатие кнопки в иерархии вьюшек, определяется несколькими ключевыми аспектами UIKit.
Понимание Responder Chain
В UIKit все представления (views) и контроллеры (view controllers) являются частью так называемой цепочки обработчиков (responder chain), которая определяет, как объекты в приложении реагируют на события пользовательского ввода, такие как касания, жесты или движения. Цепочка респондеров следует по иерархии представлений от первого респондера к следующим объектам в иерархии, пока событие не будет обработано или пока не будут исчерпаны все возможные респондеры.
Как она проходит
1️⃣Начальная точка: Обычно, когда происходит нажатие на кнопку, система сначала пытается определить, какой view в иерархии непосредственно получил касание. Это view становится первым респондером для события.
2️⃣Восходящая передача: Если view (или кнопка) решает, что она не будет обрабатывать событие, событие передается его родительскому view. Этот процесс продолжается вверх по иерархии view, пока не будет найден подходящий обработчик или пока событие не достигнет корневого view.
3️⃣Контроллеры представления: Если ни один из view не обработал событие, событие передается контроллеру представления, который управляет текущим view.
4️⃣Дополнительные обработчики: Если контроллер представления также не обрабатывает событие, оно может быть передано дальше другим контроллерам или объектам, таким как UIWindow или UIApplication, и, в конечном счете, AppDelegate.
Исключительная ситуация
Однако, если какой-то из объектов в цепочке респондеров переопределяет метод обработки и возвращает, что он обработал событие, обработка события прекращается, и оно не распространяется дальше по цепочке.
Если никакой из view или контроллеров в иерархии не обработает событие, последними потенциальными обработчиками будут объекты на уровне приложения, такие как UIWindow или UIApplication, и в крайнем случае AppDelegate. В стандартной ситуации обычно ожидается, что событие будет обработано на уровне view или контроллера представления, но возможность распространения до самого верха существует.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤1👍1
  Anonymous Quiz
    57%
    defer
      
    29%
    guard
      
    9%
    finally
      
    5%
    ensure
      
    Что такое модификатор памяти weak ?
Спросят с вероятностью 27%
Модификатор памяти weak используется для предотвращения так называемых "сильных ссылочных циклов" (strong reference cycles) между экземплярами классов. Возникают, когда два объекта взаимно ссылаются друг на друга сильными ссылками, что препятствует автоматическому подсчёту ссылок (Automatic Reference Counting, ARC) корректно управлять памятью и освобождать эти объекты.
Как он работает
Создаёт "слабую ссылку" на объект, в отличие от обычной "сильной ссылки". Удерживают объект в памяти, пока на него существует хотя бы одна такая ссылка. В отличие от них, слабые ссылки не увеличивают счётчик ссылок объекта, к которому они относятся. Это означает, что объект может быть освобождён из памяти, даже если на него существуют слабые ссылки.
В этом примере, если бы
Зачем его использовать
Использование рекомендуется в случаях, когда вы хотите избежать владения одним объектом другим в такой степени, что это мешает освобождению памяти. Это часто встречается в отношениях "один ко многим", где один объект может иметь ссылки на многих дочерних, но дочерние объекты не должны "владеть" родителем.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
  Спросят с вероятностью 27%
Модификатор памяти weak используется для предотвращения так называемых "сильных ссылочных циклов" (strong reference cycles) между экземплярами классов. Возникают, когда два объекта взаимно ссылаются друг на друга сильными ссылками, что препятствует автоматическому подсчёту ссылок (Automatic Reference Counting, ARC) корректно управлять памятью и освобождать эти объекты.
Как он работает
Создаёт "слабую ссылку" на объект, в отличие от обычной "сильной ссылки". Удерживают объект в памяти, пока на него существует хотя бы одна такая ссылка. В отличие от них, слабые ссылки не увеличивают счётчик ссылок объекта, к которому они относятся. Это означает, что объект может быть освобождён из памяти, даже если на него существуют слабые ссылки.
class Person {
    var name: String
    var pet: Pet?
    init(name: String) {
        self.name = name
    }
    deinit {
        print("\(name) is being deinitialized")
    }
}
class Pet {
    var name: String
    weak var owner: Person?
    init(name: String) {
        self.name = name
    }
    deinit {
        print("\(name) is being deinitialized")
    }
}
var john: Person? = Person(name: "John")
var dog: Pet? = Pet(name: "Fido")
john?.pet = dog
dog?.owner = john
john = nil
dog = nilВ этом примере, если бы
owner в классе Pet был сильной ссылкой, установка john = nil и dog = nil не привела бы к освобождению памяти, занимаемой этими объектами, потому что они бы продолжали ссылаться друг на друга. Однако, поскольку owner является слабой ссылкой, освобождение john не мешает автоматическому освобождению dog.Зачем его использовать
Использование рекомендуется в случаях, когда вы хотите избежать владения одним объектом другим в такой степени, что это мешает освобождению памяти. Это часто встречается в отношениях "один ко многим", где один объект может иметь ссылки на многих дочерних, но дочерние объекты не должны "владеть" родителем.
weak используется для создания слабых ссылок на объекты, чтобы помочь избежать проблем с управлением памятью, которые могут возникнуть из-за сильных ссылочных циклов. Это как если бы вы держали в руках шарик на ниточке, но так, чтобы он мог легко высвободиться и улететь, когда это будет нужно, не заставляя вас его держать.👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Anonymous Quiz
    75%
    Observer
      
    20%
    Delegate
      
    3%
    Singleton
      
    1%
    Factory
      
    👀1
  Как проходит жизненный цикл vue контроллера ?
Спросят с вероятностью 18%
Жизненный цикл во Vue.js описывает различные стадии от создания до уничтожения компонента. Можно использовать "хуки" жизненного цикла для выполнения кода в определённые моменты:
1️⃣beforeCreate
✅Этот хук вызывается сразу после инициализации экземпляра, до инициализации реактивных данных и событийных слушателей.
2️⃣created
✅На этом этапе экземпляр полностью создан, установлены реактивные данные и настроены событийные слушатели, но компонент ещё не монтируется в DOM.
3️⃣beforeMount
✅Вызывается непосредственно перед тем, как компонент монтируется в DOM. В этот момент можно получить доступ к шаблону и виртуальному DOM, но ещё не к реальному DOM.
4️⃣mounted
✅Этот хук вызывается после того, как компонент был вставлен в DOM. Здесь можно выполнять действия, которые требуют взаимодействия с DOM (например, через
5️⃣beforeUpdate
✅Вызывается после изменения данных, которые приводят к необходимости обновления DOM, но перед самим обновлением. Это хорошее место для доступа к существующему DOM перед его ре-рендерингом.
6️⃣updated
✅Вызывается после обновления DOM в результате изменения данных. Используется для выполнения кода, зависимого от актуализированного DOM.
7️⃣beforeDestroy
✅Этот хук вызывается перед уничтожением экземпляра компонента. Здесь можно выполнить необходимую очистку, например, удалить событийные слушатели или отменить таймеры.
8️⃣destroyed
✅Вызывается после уничтожения экземпляра компонента, когда все директивы компонента разрешены, событийные слушатели удалены и реактивные связи разорваны.
Этот код демонстрирует, как можно использовать хуки жизненного цикла Vue.js для различных целей, связанных с его состоянием и интеракциями с DOM.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 18%
Жизненный цикл во Vue.js описывает различные стадии от создания до уничтожения компонента. Можно использовать "хуки" жизненного цикла для выполнения кода в определённые моменты:
1️⃣beforeCreate
✅Этот хук вызывается сразу после инициализации экземпляра, до инициализации реактивных данных и событийных слушателей.
2️⃣created
✅На этом этапе экземпляр полностью создан, установлены реактивные данные и настроены событийные слушатели, но компонент ещё не монтируется в DOM.
3️⃣beforeMount
✅Вызывается непосредственно перед тем, как компонент монтируется в DOM. В этот момент можно получить доступ к шаблону и виртуальному DOM, но ещё не к реальному DOM.
4️⃣mounted
✅Этот хук вызывается после того, как компонент был вставлен в DOM. Здесь можно выполнять действия, которые требуют взаимодействия с DOM (например, через
this.$el).5️⃣beforeUpdate
✅Вызывается после изменения данных, которые приводят к необходимости обновления DOM, но перед самим обновлением. Это хорошее место для доступа к существующему DOM перед его ре-рендерингом.
6️⃣updated
✅Вызывается после обновления DOM в результате изменения данных. Используется для выполнения кода, зависимого от актуализированного DOM.
7️⃣beforeDestroy
✅Этот хук вызывается перед уничтожением экземпляра компонента. Здесь можно выполнить необходимую очистку, например, удалить событийные слушатели или отменить таймеры.
8️⃣destroyed
✅Вызывается после уничтожения экземпляра компонента, когда все директивы компонента разрешены, событийные слушатели удалены и реактивные связи разорваны.
export default {
  name: 'MyComponent',
  data() {
    return {
      message: 'Hello, Vue!'
    };
  },
  beforeCreate() {
    console.log('beforeCreate: Компонент еще не создан.');
  },
  created() {
    console.log('created: Компонент создан.');
  },
  beforeMount() {
    console.log('beforeMount: Компонент скоро будет монтирован в DOM.');
  },
  mounted() {
    console.log('mounted: Компонент монтирован в DOM.');
  },
  beforeUpdate() {
    console.log('beforeUpdate: Компонент скоро будет обновлен.');
  },
  updated() {
    console.log('updated: Компонент обновлен.');
  },
  beforeDestroy() {
    console.log('beforeDestroy: Компонент ск
оро будет уничтожен.');
  },
  destroyed() {
    console.log('destroyed: Компонент уничтожен.');
  }
}Этот код демонстрирует, как можно использовать хуки жизненного цикла Vue.js для различных целей, связанных с его состоянием и интеракциями с DOM.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
🤯10🤔5😁3
  Anonymous Quiz
    53%
    protocol class
      
    10%
    class only
      
    33%
    class
      
    4%
    typealias
      
    Какие бывают модификаторы доступа ?
Спросят с вероятностью 27%
Модификаторы доступа используются для инкапсуляции данных и функциональности в классах, структурах и других типах, позволяя контролировать, как и где можно получать доступ к членам типа (например, свойствам, методам, инициализаторам). Это ключевая часть архитектуры ПО, поскольку правильно настроенный контроль доступа может предотвратить несанкционированное изменение состояния объекта и улучшить модульность кода.
Есть несколько уровней доступа:
1️⃣Open и Public:
✅
✅
   
2️⃣Internal:
✅
3️⃣File-private:
✅
4️⃣Private:
✅
Зачем они нужны?
Помогают обеспечивать безопасность и чистоту архитектуры приложения, позволяя разработчикам точно контролировать, какие части кода могут использовать другие части кода. Это особенно важно в больших проектах и при создании библиотек, где необходимо чётко разграничивать внутреннюю логику и публичный интерфейс модулей.
Модификаторы доступа — это правила, которые определяют, кто и где может использовать части вашего кода. Они помогают делать код безопасным и организованным, как закрытые и открытые секции в библиотеке: некоторые доступны всем, а другие — только избранным.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
  Спросят с вероятностью 27%
Модификаторы доступа используются для инкапсуляции данных и функциональности в классах, структурах и других типах, позволяя контролировать, как и где можно получать доступ к членам типа (например, свойствам, методам, инициализаторам). Это ключевая часть архитектуры ПО, поскольку правильно настроенный контроль доступа может предотвратить несанкционированное изменение состояния объекта и улучшить модульность кода.
Есть несколько уровней доступа:
1️⃣Open и Public:
✅
open позволяет элементам быть доступными и наследуемыми вне определяющего их модуля (например, библиотеки или фреймворка). open также позволяет переопределять методы в расширяющих модулях.✅
public делает элементы доступными вне модуля, но не позволяет их наследование или переопределение вне модуля.2️⃣Internal:
✅
internal делает элементы доступными в пределах того же модуля. Это уровень доступа по умолчанию в Swift, если явно не указан другой модификатор.3️⃣File-private:
✅
fileprivate ограничивает доступ к элементу в пределах того файла исходного кода, в котором он объявлен.4️⃣Private:
✅
private строго ограничивает область видимости элемента рамками его объявления. То есть private элемент доступен только внутри того контекста (например, класса или структуры), где он был объявлен, и в расширениях этого класса или структуры в том же файле.open class OpenClass {
    open var openVariable: Int = 1
    public var publicVariable: Int = 2
    internal var internalVariable: Int = 3
    fileprivate var fileprivateVariable: Int = 4
    private var privateVariable: Int = 5
}
public class PublicClass {
    // Этот класс не может быть наследован за пределами этого модуля
}
internal class InternalClass {
    // Доступен только внутри того же модуля
}
fileprivate class FilePrivateClass {
    // Доступен только внутри этого файла
}
private class PrivateClass {
    // Доступен только внутри других объявлений в этом же файле
}
Зачем они нужны?
Помогают обеспечивать безопасность и чистоту архитектуры приложения, позволяя разработчикам точно контролировать, какие части кода могут использовать другие части кода. Это особенно важно в больших проектах и при создании библиотек, где необходимо чётко разграничивать внутреннюю логику и публичный интерфейс модулей.
Модификаторы доступа — это правила, которые определяют, кто и где может использовать части вашего кода. Они помогают делать код безопасным и организованным, как закрытые и открытые секции в библиотеке: некоторые доступны всем, а другие — только избранным.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 823 вопросов на IOS разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Anonymous Quiz
    13%
    iterate(over:)
      
    3%
    generate()
      
    59%
    lazy()
      
    25%
    sequence(first:next:)
      
    Оптимизация "copy on write" (COW) представляет собой стратеги оптимизации управления памятью, применяемую к коллекциям и другим структурам данных, которые ведут себя как типы значений (value types), такие как структуры и перечисления. Эта стратегия позволяет избежать ненужного копирования объектов до тех пор, пока не произойдет попытка изменения.
Когда вы работаете с типами значений, такими как массивы или словари, и присваиваете их новой переменной или константе, по умолчанию они копируются. В большинстве случаев это поведение эффективно и безопасно, поскольку гарантирует, что изменения в одном месте не повлияют на другое. Однако, если эти структуры данных велики, копирование может быть ресурсоемкой операцией.
Чтобы оптимизировать производительность, используется техника "copy on write". Суть её в том, что фактическое копирование происходит только в момент изменения данных. Если вы просто передаете данные или работаете с ними в режиме только для чтения, копирование не производится. Это значительно снижает нагрузку на память и процессор, особенно при работе с большими объемами данных.
var original = [1, 2, 3]
var copy = original // Здесь копирование не происходит, обе переменные ссылаются на один и тот же участок памяти
copy.append(4) // Только сейчас происходит фактическое копирование, так как мы модифицируем `copy`
В этом примере, когда мы добавляем элемент в
copy, он определяет, что массив должен быть изменен, и только тогда происходит реальное копирование. До момента модификации original и copy эффективно ссылаются на одни и те же данные, что экономит ресурсы.Суть оптимизации "copy on write" заключается в минимизации издержек на копирование данных, проводя копирование только тогда, когда это действительно необходимо для изменения данных. Это улучшает производительность при работе с большими структурами данных, сохраняя при этом безопасность и простоту работы с типами значений.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤2😁2
  Anonymous Quiz
    38%
    func getFirstString(strings: [String]) -> String { return strings.first }
      
    7%
    function getFirstString([String]) -> String { return strings[0] }
      
    10%
    func getFirstString(strings: Array<String>) -> String { return strings.first }
      
    45%
    func getFirstString(strings: [String]) -> String { return strings[0] }
      
    😁2🤯1
  SOLID — это аббревиатура, обозначающая пять основных принципов объектно-ориентированного программирования и дизайна, которые помогают разработчикам создавать системы, легкие в поддержке и расширении. Эти принципы были сформулированы Робертом Мартином (Uncle Bob) и являются ключевыми в построении эффективных, масштабируемых и поддерживаемых программных систем. Вот они:
SOLID помогает создавать более гибкие, устойчивые к изменениям и легкие в поддержке системы. Применение этих принципов способствует созданию кода, который легче понимать, расширять и поддерживать.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  Anonymous Quiz
    27%
    Методика для прерывания выполнения функции, если значение `nil`
      
    25%
    Способ вызова свойства, метода или субскрипта на `nil` без вызова ошибки
      
    45%
    Последовательность условных операторов для проверки `nil`
      
    3%
    Техника для уменьшения использования памяти при работе с переменными
      
    Когда работаешь с замыканиями или опциональными типами, часто встречаешься с понятиями "weak" и "unowned". Оба этих ключевых слова используются для предотвращения утечек памяти в случае циклических ссылок, но между ними есть важные различия.
nil, когда объект, на который она указывает, уничтожается. Это полезно, когда объект может быть уничтожен в любой момент, и вы хотите избежать висячих указателей.class ExampleClass {
    var property: AnotherClass?
}
class AnotherClass {
    weak var backReference: ExampleClass?
}class ExampleClass {
    var property: AnotherClass?
}
class AnotherClass {
    unowned var backReference: ExampleClass
}Главное различие заключается в том, что "weak" ссылки всегда являются опциональными и автоматически становятся
nil, когда объект удаляется, предотвращая висячие указатели. "Unowned" ссылки предполагают, что другой объект будет жить столько же или дольше, и поэтому они не являются опциональными и не обнуляются.Важно понимать эти различия, чтобы избежать ошибок времени выполнения, особенно при работе с несильными ссылками, так как обращение к уже освобожденному объекту через несильную ссылку приведет к крашу программы.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  ❤1👍1
  