и посмотреть медиа
Swift | Вопросы собесов
и посмотреть медиа
Вопросы для собеседований по Swift, тесты и задачи для iOS-разработчиков в Telegram.
Вопросы для собеседований по Swift, тесты и задачи для iOS-разработчиков в Telegram.
AI бот для озвучки текста и клонирования голоса в Telegram. Создавай аудио с помощью нейросети быстро и просто.
Канал посвящен подготовке к собеседованиям по языку Swift. Здесь собраны актуальные вопросы, тесты, практические задачи и информация о вакансиях. Идеально для начинающих и опытных iOS-разработчиков, желающих освежить знания и успешно пройти интервью.
🤔 Как решить проблему race condition? Race condition — это ошибка, возникающая при одновременном доступе нескольких потоков к одним и тем же данным без должной синхронизации. Для решения проблемы race condition в Swift используются механизмы синхронизации, такие как блокировки (locks), семафоры или серийные очереди GCD. Эти инструменты позволяют ограничить доступ к общим ресурсам, чтобы только один поток мог их изменять в любой момент времени. Это предотвращает непредсказуемое поведение программы и ошибки при многопоточном доступе к данным. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какой путь проделывает ивент , когда пользователь нажимает на приложение? Когда пользователь нажимает на иконку приложения на домашнем экране, iOS проходит несколько этапов перед тем, как приложение становится активным. 🚩Разберём путь события подробнее 🟠Пользователь нажимает на иконку (SpringBoard) iOS-устройства управляются системой SpringBoard – это оболочка, отвечающая за домашний экран, иконки, фоновые процессы. Когда пользователь тапает на иконку приложения, SpringBoard отправляет событие UIApplicationLaunchOptionsKey в систему. 🟠iOS загружает процесс приложения Если приложение не запущено: - iOS создаёт новый процесс и выделяет память. - Загружаются зависимости (библиотеки, фреймворки). - Создаётся объект UIApplication. 🟠Вызывается `application(_:didFinishLaunchingWithOptions:)` Здесь приложение инициализируется и загружается основной UI. Метод в AppDelegate: func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { print("Приложение запущено") return true } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Счётчик ссылок дошёл до нуля — в какой момент удалим объект? Как только счётчик ссылок объекта становится равным нулю, ARC немедленно освобождает память. Удаление происходит автоматически в этот момент, и вызывается деинициализатор (deinit), если он реализован. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что такое gitflow? В основе Git Flow – несколько веток с разными ролями, чтобы команда могла параллельно разрабатывать новые фичи, исправлять баги и выпускать релизы. 🚩Как работает Git Flow? 🟠Основные ветки (`main` и `develop`) - main – содержит только стабильные версии. - develop – основная ветка разработки, в неё вливаются все новые фичи. 🟠Разработка новых фич (feature branches) - Каждая новая фича создаётся в отдельной ветке feature/*. - После завершения сливается в develop. git checkout develop git checkout -b feature/new-cool-feature # Разработка... git checkout develop git merge feature/new-cool-feature git branch -d feature/new-cool-feature 🟠Подготовка к релизу (release branches) - Когда код стабилен, создаётся ветка release/* от develop. - Здесь можно тестировать и исправлять баги. - После финального теста сливается в main и develop. git checkout develop git checkout -b release/1.0 # Фиксим баги, тестируем... git checkout main git merge release/1.0 git tag -a v1.0 -m "Release 1.0" git checkout develop git merge release/1.0 git branch -d release/1.0 🟠Горячие фиксы (hotfix branches) - Если критический баг в main, создаём hotfix/*. - После исправления вливаем в main и в develop. git checkout main git checkout -b hotfix/urgent-bugfix # Фиксим баг... git checkout main git merge hotfix/urgent-bugfix git checkout develop git merge hotfix/urgent-bugfix git branch -d hotfix/urgent-bugfix Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие есть варианты обезопасить работу с историей 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) } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что будет, если применить модификатор к View? SwiftUI создаст новую View с измененными параметрами, не изменяя оригинальный объект. Это позволяет оптимизировать ререндеринг, так как фреймворк пересоздает только измененные элементы. Благодаря иммутабельности View-дерева, SwiftUI автоматически сравнивает изменения (diffing), обновляя только те части интерфейса, которые изменились. Это делает рендеринг быстрым и эффективным. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Перечислите все ленивые (lazy) контейнеры/вью? В iOS существует несколько ленивых (lazy) контейнеров и вью, которые откладывают создание или загрузку элементов до момента их фактического использования. 🚩`lazy var` (ленивые свойства) Обычное свойство инициализируется сразу, а lazy – только при первом вызове. class Example { lazy var expensiveObject: Data = { print("Объект создан!") return Data() }() } let obj = Example() print("Объект ещё не создан") _ = obj.expensiveObject // Только теперь создастся 🚩`LazySequence` и `LazyCollection` Если вы хотите избежать лишних вычислений, можно использовать ленивую последовательность: let numbers = (1...1000).lazy.map { $0 * 2 } // Не вычисляется сразу! print(numbers.first!) // Только теперь вычисляется первый элемент 🚩`LazyVStack`, `LazyHStack`, `LazyGrid` (SwiftUI) В отличие от обычных VStack и HStack, ленивые версии создают элементы только при прокрутке. ScrollView { LazyVStack { ForEach(0.. UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = "Строка \(indexPath.row)" return cell } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что такое static в Swift? static — ключевое слово, обозначающее, что свойство или метод относится к типу, а не к экземпляру. В классах также используется class для переопределяемых методов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие объекты участвуют в зависимостях? В зависимости от контекста, под "объектами, участвующими в зависимостях" можно понимать различные концепции. В программировании под зависимостями чаще всего подразумеваются связи между объектами или модулями, где один объект зависит от другого для выполнения своих функций. 🚩Объект-зависимый и объект-зависимость Когда один объект (например, ViewController) зависит от другого (NetworkManager), первый становится клиентом, а второй – зависимостью. class NetworkManager { func fetchData() { print("Данные загружены") } } class ViewController { let networkManager: NetworkManager init(networkManager: NetworkManager) { self.networkManager = networkManager } func loadData() { networkManager.fetchData() } } 🚩Протоколы как способ ослабления зависимостей Жесткие зависимости можно ослабить, используя протоколы. protocol NetworkService { func fetchData() } class NetworkManager: NetworkService { func fetchData() { print("Данные загружены") } } class ViewController { let networkService: NetworkService init(networkService: NetworkService) { self.networkService = networkService } func loadData() { networkService.fetchData() } } 🚩Зависимости в архитектурах (MVVM, VIPER, DI) В MVVM зависимость между ViewController и ViewModel. В VIPER модули зависят друг от друга, но слабо связаны через протоколы. В DI (Dependency Injection) зависимости передаются снаружи, что повышает тестируемость и гибкость. 🚩Менеджеры зависимостей Чтобы управлять внешними зависимостями (библиотеками), используются Swift Package Manager (SPM) CocoaPods Carthage Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаТолько зарегистрированные пользователи могут делиться своим мнением.
Станьте первым, кто поделится своим впечатлением об этом ресурсе!