Obejective-С.Природа неопределенного поведения, когда метод переопределен в категории - PullRequest
0 голосов
/ 27 февраля 2019

Я прочитал это:

Избегайте столкновений имен методов категории

Поскольку методы, объявленные в категории, добавляются в существующий класс, вам нужно быть очень осторожным с именами методов.

Если имя метода, объявленного в категории, совпадает с именем метода в исходном классе или методом в другой категории в том же классе (или даже в суперклассе), поведение не определяется каккакой метод реализации используется во время выполнения.Это менее вероятно, если вы используете категории со своими собственными классами, но могут вызывать проблемы при использовании категорий для добавления методов в стандартные классы Cocoa или Cocoa Touch.

Но яИнтересно, почему это происходит.Я подозреваю, что это потому, что диспетчеризация методов работает в Objective-C, но я не смог найти ни одной статьи, которая бы объясняла это категориями.

Как категории изменяют список методов?Почему это вызывает неопределенное поведение?

1 Ответ

0 голосов
/ 02 марта 2019

Источник для среды выполнения доступен.Вы можете прочитать окончательную правду.:)

В абстрактных терминах то, как среда выполнения оптимизирует списки методов для отправок, со временем изменилось.Переопределение методов через категории всегда было отрывочным, потому что при этом вы фактически «теряете» реализацию.Если утерянный метод относится к базовому классу, он может иметь детали реализации, которые копаются во внутренностях класса таким образом, что метод, загруженный позже, не должен этого делать.

Итак, очень мало усилийсделан на то, чтобы сделать поведение последовательным.Особенно, если последовательность должна стоить скорости.

...