Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 137новых вакансий за сутки·64 958вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 953
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 394 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python13 555
  • Облачные технологии9 649
  • QA вакансии2 810
  • Android1 650
  • Инженер данных1 068
  • Продакт-менеджер414

Разработка

  • Backend вакансии1 534
  • iOS1 533
  • AI вакансии749
  • Fullstack вакансии623
  • Frontend вакансии536
  • Mobile вакансии28

По стеку

  • Go7 558
  • Java4 778
  • Node.js1 528
  • Kotlin1 348
  • Rust1 252
  • .NET1 154
  • PHP506
  • C++327
  • C#314

DevOps и инфраструктура

  • Kubernetes5 503
  • Linux-инфраструктура4 223
  • DevOps вакансии4 089
  • Terraform / IaC3 059
  • Мониторинг и Observability1 414
  • CI/CD1 240
  • SRE411
  • Кибербезопасность61

Аналитика и данные

  • Аналитик данных612
  • Бизнес-аналитик572
  • Data Scientist528
  • Системный аналитик69

Другие направления

  • Проджект-менеджер147
  • UI/UX дизайн80
  • Ручное тестирование14

По регионам

  • Вакансии в США30 650
  • Вакансии в Европе12 551
  • Работа в России3 510
  • Вакансии в Канаде2 658

По формату

  • Удалённые вакансии48 186
  • Релокация в США30 650
  • Гибридная работа7 410
  • Офисная работа5 407

По уровню

  • Senior вакансии26 826
  • Middle вакансии12 754
  • Junior вакансии4 519

Сейчас нанимают

Все компании
  • Rakuten189 вакансий
  • Wise189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis47 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Darktrace17 вакансий
  • Monzo17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме UIKitВсе вопросы
UIKitMiddleТеория

В чём разница между addTarget(_:action:for:) и closures для действий кнопок?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

addTarget хранит слабую ссылку на target автоматически, но требует @objc и selector. iOS 14+ UIAction/addAction дают type-safe closure API без этих ограничений. В обоих случаях важно избегать retain cycle и дублирования при многократной регистрации.

Target-Action через addTarget

Классический UIKit API. Target хранится как weak ссылка внутри UIControl, что автоматически защищает от retain cycle.

final class LoginViewController: UIViewController {
    private let loginButton = UIButton(type: .system)

    override func viewDidLoad() {
        super.viewDidLoad()
        loginButton.addTarget(
            self,
            action: #selector(loginTapped),
            for: .touchUpInside
        )
    }

    @objc private func loginTapped() {
        print("Вход выполнен")
    }

    // Удаление конкретного обработчика
    func detach() {
        loginButton.removeTarget(self, action: #selector(loginTapped), for: .touchUpInside)
    }
}
  • Плюсы: нет retain cycle; Objective-C-совместимость; можно передать UIControl и UIEvent в параметрах selector; поддержка target = nil (responder chain).
  • Минусы: требует @objc; selector — строка в рантайме (опечатка → crash до iOS 9, с iOS 9 — #selector уменьшает риск, но не устраняет полностью); нельзя захватить произвольный контекст без дополнительного свойства.

addTarget(_:action:for:) vs замыкания для кнопок

UIControl исторически использует паттерн Target-Action: объект-получатель (target) и Objective-C-совместимый selector (action). В Swift closure-based подход стал популярной альтернативой, но у каждого есть свои плюсы и ограничения.

Closure-based подход (iOS 14+)

С iOS 14 появился UIAction и addAction(_:for:) — нативный closure API прямо в UIKit.

// iOS 14+ — рекомендуемый closure-способ
let action = UIAction(title: "") { [weak self] _ in
    self?.handleLogin()
}
loginButton.addAction(action, for: .touchUpInside)

// Более компактно через конструктор кнопки (iOS 15+)
let button = UIButton(
    primaryAction: UIAction { [weak self] _ in
        self?.handleLogin()
    }
)

Closure через расширение UIControl (iOS 13 и ниже)

До iOS 14 разработчики реализовывали closure API вручную через ассоциированные объекты.

private class ActionHandler {
    let action: () -> Void
    init(_ action: @escaping () -> Void) { self.action = action }
    @objc func invoke() { action() }
}

private var handlerKey = "handlerKey"

extension UIControl {
    func addHandler(for events: UIControl.Event, handler: @escaping () -> Void) {
        let wrapper = ActionHandler(handler)
        addTarget(wrapper, action: #selector(ActionHandler.invoke), for: events)
        // Храним wrapper через ассоциированный объект
        objc_setAssociatedObject(self, &handlerKey, wrapper, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
}

// Использование
loginButton.addHandler(for: .touchUpInside) { [weak self] in
    self?.handleLogin()
}

Сравнение по ключевым критериям

  • Retain cycle: addTarget хранит weak target автоматически; в closures нужно явно писать [weak self].
  • Compile-time safety: #selector проверяется компилятором (Swift 2.2+), но метод должен быть @objc; UIAction с замыканием — полностью type-safe.
  • Контекст: замыкание может захватить локальные переменные напрямую; addTarget требует хранить контекст в свойствах объекта.
  • Удаление: removeTarget/removeAction — у UIAction есть identifier для точечного удаления.
  • Поддержка iOS: addTarget — iOS 2+; UIAction — iOS 14+.

Подводные камни

  • Retain cycle в замыканиях — если не написать [weak self], замыкание удержит ViewController, и он никогда не освободится. Это самая частая утечка памяти в UIKit-коде.
  • Множественные вызовы addTarget — добавление одного и того же target+action несколько раз (например, в viewWillAppear) приводит к многократному вызову handler. UIControl дедуплицирует пары только при одинаковом target+action+event, но если метод другой — нет.
  • @objc и минимальный деплоймент — необходимость маркировать приватные методы @objc нарушает инкапсуляцию и увеличивает бинарный размер (objc runtime сохраняет символ).
  • Ассоциированные объекты и жизненный цикл — при самодельном closure API через objc_setAssociatedObject хранение нового wrapper перезаписывает старый, что сбрасывает предыдущий обработчик неочевидно.
  • UIAction identifier коллизии — если не указать уникальный UIAction.Identifier, при повторном добавлении действие не заменится (в отличие от addTarget).
  • removeAllTargets в реиспользуемых ячейках — UITableViewCell переиспользует вью; если не вызвать removeAllTargets() в prepareForReuse, накапливаются обработчики от предыдущих конфигураций.

Частые вопросы на собеседовании

  • Что такое Auto Layout и как создавать constraints программно по сравнению с Interface Builder?
  • Как работает навигация в UIKit с помощью UINavigationController?
  • В чём разница между UIView и UIViewController?
  • Как работает жизненный цикл UIViewController? Опишите каждый lifecycle-метод.

Типичные ошибки

  • Сводить «addTarget(_:action:for:) и closures для действий кнопок» к синтаксису и не объяснять main thread.
  • Игнорировать жизненный цикл, основной поток или момент освобождения ресурсов в сценарии uikit-21.
  • Выбирать API по привычке, не проверяя состояние, ошибки, доступность и платформенные ограничения.

Что проверяет интервьюер

  • Формулирует точную модель для «addTarget(_:action:for:) и closures для действий кнопок» и подтверждает ее корректным примером.
  • Умеет связать ответ с Auto Layout, тестированием и отладкой на устройстве.
  • Называет ограничения подхода uikit-21, включая производительность, память и сопровождение.

Как вы знаете этот вопрос?

Проверить себя по теме UIKit →

Источники

  • https://developer.apple.com/documentation/uikit/uicontrol

Связанные темы

UIKitframework-api-designMobile-Engineering