Что такое метод swizzling
Что проверяют
Знаете ли вы механизм и понимаете ли, почему его считают опасным.
Как отвечать
Это подмена реализации метода во время выполнения: в таблице методов класса реализации двух селекторов меняются местами. Возможен благодаря динамической природе среды Objective-C, где вызов метода это отправка сообщения, а не прямой переход.
Где применяется по делу:
- аналитика и журналирование: перехват появления экрана без правки каждого контроллера;
- обход ошибки в системной библиотеке, когда исправить исходники невозможно;
- инструменты разработки: отладочные наложения, измерения.
Почему это опасно, и это главная часть ответа:
- эффект глобальный. Подмена действует на все экземпляры класса во всём приложении, включая код чужих библиотек, которые на такое не рассчитывали;
- конфликты: две библиотеки подменяют один метод, и результат зависит от порядка их загрузки. Отладка таких проблем крайне неприятна;
- непредсказуемость при обновлении системы: внутреннее поведение метода может измениться, и подмена сломается или начнёт работать иначе;
- невидимость: в исходниках вызывается один метод, а выполняется другой, и понять это по коду невозможно.
Ограничение в Swift: подменять можно только методы, доступные среде Objective-C. Чистый Swift использует статическую или табличную диспетчеризацию, поэтому нужны специальные пометки, делающие вызов динамическим.
Если применять всё-таки приходится, правила такие: делать подмену один раз и как можно раньше, добавлять к своим методам уникальный префикс, обязательно вызывать оригинальную реализацию внутри своей, и подменять только те методы, которые действительно принадлежат вашему коду или задокументированы.
Практический вывод: почти всегда есть более безопасная альтернатива, будь то наследование, обёртка или базовый класс. Подмена это последний вариант.
Где спотыкаются
Считают приём обычным инструментом расширения.
Забывают вызвать оригинальную реализацию.
Не учитывают конфликты с библиотеками.
Пытаются подменить метод чистого Swift без пометки динамичности.