и посмотреть медиа
Swift | Interview Questions
и посмотреть медиа
Swift interview questions, tests and tasks for iOS developers in Telegram.
Swift interview questions, tests and tasks for iOS developers in Telegram.
AI bot for text-to-speech and voice cloning in Telegram. Create audio using neural network quickly and easily.
The channel is dedicated to preparing for Swift language interviews. It contains current questions, tests, practical tasks and vacancy information. Ideal for beginner and experienced iOS developers who want to refresh their knowledge and successfully pass interviews.
🤔 Расскажи жизненный цикл vue контроллера В iOS жизненный цикл UIViewController определяет последовательность вызовов методов, происходящих во время создания, отображения, скрытия и уничтожения контроллера. 🚩Подробное объяснение стадий 🟠Создание (Initialization) На этом этапе создаётся экземпляр UIViewController, но его view ещё не загружено. - Можно переопределить init() или init(coder:), если контроллер создаётся из Storyboard. - Можно передавать данные через инициализатор. class MyViewController: UIViewController { var titleText: String init(titleText: String) { self.titleText = titleText super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } } 🟠Загрузка View (Loading) Когда контроллеру нужно отобразить свой view, вызывается loadView() (если представление создаётся программно) и viewDidLoad() (если загружается из Storyboard или XIB). loadView() – создаёт view программно (обычно не переопределяется). viewDidLoad() – вызывается один раз после загрузки view. override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white print("viewDidLoad - View загружено в память") } 🟠Отображение на экране (Appearing & Disappearing) Когда UIViewController добавляется в иерархию UIWindow и становится видимым, вызываются следующие методы: viewWillAppear(_:) – вызывается перед появлением на экране. viewDidAppear(_:) – вызывается после появления на экране. viewWillDisappear(_:) – вызывается перед скрытием. viewDidDisappear(_:) – вызывается после скрытия. override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) print("viewWillAppear - View скоро появится на экране") } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) print("viewDidAppear - View уже на экране") } 🟠Удаление из памяти (Deallocation) Когда UIViewController больше не нужен, вызывается deinit(), а его view может быть выгружено с вызовом viewDidUnload() (но сейчас это редко используется). deinit { print("deinit - Контроллер удалён из памяти") } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как отличить Domain Driven Design в приложении? Приложения с DDD фокусируются на логике предметной области и разделении модулей по бизнес-контекстам. Выделяются сущности, агрегаты, репозитории и фабрики. Основная цель — обеспечение точного моделирования бизнес-логики, независимого от технической реализации. Это позволяет создавать масштабируемую и легко поддерживаемую архитектуру. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие виды диспетчеризации существуют в свифт? В Swift существует несколько видов диспетчеризации, которые определяют, как и когда вызываются методы или функции. Основные виды диспетчеризации включают статическую диспетчеризацию (static dispatch), диспетчеризацию по таблице виртуальных функций (vtable dispatch), диспетчеризацию по свидетелю (witness table dispatch) и динамическую диспетчеризацию (dynamic dispatch). Рассмотрим их подробнее: 🟠Статическая диспетчеризация (Static Dispatch) Вызов функции или метода определяется на этапе компиляции. Используется для функций и методов, которые не переопределяются в подклассах или не являются динамическими. Для структур, перечислений и final классов. struct MyStruct { func printMessage() { print("Hello from MyStruct") } } let instance = MyStruct() instance.printMessage() // Вызов определяется на этапе компиляции 🟠Диспетчеризация по таблице виртуальных функций (Vtable Dispatch) Используется для вызова методов класса, которые могут быть переопределены в подклассах. Виртуальная таблица (vtable) используется для определения, какой метод вызывать. Для классов и их подклассов. 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 🟠Диспетчеризация по свидетелю (Witness Table Dispatch) Используется для вызова методов протоколов, реализованных типами. Таблица свидетелей (witness table) используется для определения, какой метод вызывать. Для типов, соответствующих протоколам. protocol MyProtocol { func printMessage() } struct MyStruct: MyProtocol { func printMessage() { print("Hello from MyStruct") } } let instance: MyProtocol = MyStruct() instance.printMessage() // Вызов определяется в runtime с использованием witness table 🟠Динамическая диспетчеризация (Dynamic Dispatch) Используется для вызова методов, отмеченных как dynamic или методов Objective-C. Метод определяется в runtime с использованием Objective-C runtime. Для методов, которые должны быть динамически разрешены в runtime, обычно для взаимодействия с Objective-C. import Foundation class MyClass: NSObject { @objc dynamic func printMessage() { print("Hello from MyClass") } } let instance = MyClass() instance.printMessage() // Вызов определяется в runtime с использованием Objective-C runtime Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Может ли у UI View не быть layer'а и наоборот? UIView всегда имеет CALayer, так как UIView — это обёртка над CALayer в UIKit. CALayer может существовать без UIView, потому что это низкоуровневый элемент Core Animation, который не зависит от UIKit. 🚩`UIView` всегда содержит `CALayer` Каждый UIView внутри себя содержит CALayer, который отвечает за отрисовку. let view = UIView() print(view.layer) // Всегда существует! 🚩`CALayer` может существовать без `UIView` CALayer можно создать и добавить в иерархию без UIView. let layer = CALayer() layer.frame = CGRect(x: 50, y: 50, width: 100, height: 100) layer.backgroundColor = UIColor.red.cgColor if let window = UIApplication.shared.windows.first { window.layer.addSublayer(layer) // Добавляем без UIView! } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие есть варианты обезопасить работу с историей images? Обеспечение безопасности работы с историей изображений в iOS-приложениях может включать несколько уровней защиты: 🟠Контроль доступа к изображениям - Используйте Privacy Settings (NSPhotoLibraryUsageDescription, NSCameraUsageDescription) для контроля доступа к фотоальбому. - Для ограниченного доступа в iOS 14+ используйте PHPickerViewController. let status = PHPhotoLibrary.authorizationStatus(for: .readWrite) if status == .authorized { // Доступ есть } else { // Запросить разрешение PHPhotoLibrary.requestAuthorization { newStatus in if newStatus == .authorized { print("Доступ получен") } } } 🟠Шифрование изображений - Если изображения сохраняются локально, используйте AES-шифрование. - Можно хранить ключ в Keychain или использовать Secure Enclave. import CommonCrypto func encryptImage(data: Data, key: Data) -> Data? { var buffer = Data(count: data.count + kCCBlockSizeAES128) var numBytesEncrypted: size_t = 0 let status = CCCrypt( CCOperation(kCCEncrypt), CCAlgorithm(kCCAlgorithmAES), CCOptions(kCCOptionPKCS7Padding), key.bytes, key.count, nil, data.bytes, data.count, &buffer, buffer.count, &numBytesEncrypted ) return status == kCCSuccess ? buffer.prefix(numBytesEncrypted) : nil } 🟠Безопасное хранение изображений Core Data с Encrypted Store – можно использовать зашифрованные базы данных, такие как SQLCipher. FileManager + Data Protection – файлы можно хранить в Application Support с флагом .completeFileProtection. Keychain – если нужно хранить ссылки на изображения или ключи. let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("secure_image.jpg") try? imageData.write(to: fileURL, options: .completeFileProtection) 🟠Ограничение кеширования изображений - Если изображение чувствительное, отключите кеширование в URLSession: let config = URLSessionConfiguration.default config.urlCache = nil // Отключаем кеш let session = URLSession(configuration: config) 🟠Защита от утечек в памяти - Убедитесь, что ссылки на изображения не создают retain cycle. - Используйте weak ссылки в кэше изображений. class ImageCache { private let cache = NSCache() func store(image: UIImage, forKey key: String) { cache.setObject(image, forKey: key as NSString) } func retrieve(forKey key: String) -> UIImage? { return cache.object(forKey: key as NSString) } } 🟠Безопасная загрузка изображений (защита от MITM) - Используйте HTTPS вместо HTTP. - Включите App Transport Security (ATS) в Info.plist. - Верифицируйте SSL-сертификаты при загрузке. func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { if let serverTrust = challenge.protectionSpace.serverTrust { let credential = URLCredential(trust: serverTrust) completionHandler(.useCredential, credential) } else { completionHandler(.cancelAuthenticationChallenge, nil) } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Можно ли изменить push, пока он тебе не показался? Да, если используется Notification Service Extension, можно перехватить и изменить UNNotificationRequest. Это должно быть сделано быстро, так как система ограничивает время на обработку. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что такое мьютекс (mutex)? Мьютекс (от англ. "mutex" - mutual exclusion, взаимное исключение) — это механизм синхронизации, используемый в многопоточном программировании для предотвращения одновременного доступа нескольких потоков к общим ресурсам, таким как переменные, структуры данных или файлы. Он помогает избежать состояния гонки (race condition), когда результат выполнения программы зависит от неопределённого порядка доступа потоков к ресурсу. 🚩Основные концепции мьютекса 🟠Взаимное исключение Мьютекс обеспечивает доступ к общему ресурсу только одному потоку в каждый момент времени. Когда один поток захватывает мьютекс, другие потоки должны ждать, пока мьютекс не будет освобождён. 🟠Захват и освобождение Поток захватывает мьютекс перед доступом к общему ресурсу и освобождает его после завершения работы с этим ресурсом. Если мьютекс уже захвачен другим потоком, текущий поток будет блокирован до тех пор, пока мьютекс не будет освобождён. 🚩Пример использования мьютекса в Swift import Foundation class SafeCounter { private var value = 0 private let lock = NSLock() func increment() { lock.lock() // Захват мьютекса value += 1 lock.unlock() // Освобождение мьютекса } func getValue() -> Int { lock.lock() // Захват мьютекса let currentValue = value lock.unlock() // Освобождение мьютекса return currentValue } } let counter = SafeCounter() DispatchQueue.global().async { for _ in 0..
Открыть канал и посмотреть медиа🤔 Что такое Quality of Service? Quality of Service (QoS) — это система приоритетов, определяющая, насколько срочно и важно выполнить задачу. От этого зависит, сколько ресурсов система выделит. Например, для UI используется самый высокий уровень (user-interactive), а для фоновых задач — низкий (background). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Чем отличается garbage collector и подсчет ссылок? Garbage Collector (GC) и Automatic Reference Counting (ARC) – это два разных подхода к управлению памятью в программировании. Они решают одну задачу: автоматическое освобождение неиспользуемой памяти, но делают это по-разному. 🚩Garbage Collector (GC) Java, Kotlin, C#, Python, JavaScript - GC периодически просматривает всю память приложения и ищет объекты, на которые больше нет ссылок. - Когда такие объекты находятся, они удаляются, а память освобождается. - Это автоматический процесс, который запускается по мере необходимости. 🚩Подсчет ссылок (ARC - Automatic Reference Counting) Где используется: Swift, Objective-C - Каждый объект имеет счетчик ссылок (reference count). - Когда переменная создает ссылку на объект, счетчик увеличивается. - Когда переменная перестает ссылаться на объект, счетчик уменьшается. - Когда счетчик достигает нуля, объект удаляется из памяти сразу же. class Person { var pet: Pet? } class Pet { var owner: Person? } let person = Person() let pet = Pet() person.pet = pet pet.owner = person // Теперь оба объекта держат друг друга, и ARC их не удалит Решение – использовать weak: class Pet { weak var owner: Person? // Теперь утечки памяти не будет } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаOnly registered users can share their opinion.
Be the first to share your impression of this resource!