Кто-нибудь может объяснить селекторы в соответствии с этим отрывком из документации Apple Objective-C? - PullRequest
7 голосов
/ 11 октября 2011

Из документации Apple Objective-C выделены жирным шрифтом соответствующие части:

Возвращение метода и типы параметров

Подпрограмма обмена сообщениями имеет доступ только к реализациям методачерез селекторы, поэтому он обрабатывает все методы одинаковым селектором.Он обнаруживает тип возврата метода и типы данных его параметров из селектора. Поэтому, за исключением сообщений, отправляемых статически типизированным получателям, динамическое связывание требует, чтобы все реализации методов с одинаковыми именами имели одинаковый тип возврата и одинаковые типы параметров. (Статически типизированные приемники являются исключением из этого правила, посколькуКомпилятор может узнать о реализации метода по типу класса.)

Хотя методы класса и методы экземпляров с одинаковыми именами представлены одним и тем же селектором, они могут иметь разные типы параметров и возвращаемые типы.

Я читал этот блок снова и снова, но я не могу пройти мимо того, что кажется противоречием.Во-первых, в нем говорится, что все реализации методов с одинаковыми именами должны иметь одинаковый тип возвращаемого значения и типы параметров из-за динамического связывания.

Поскольку он обрабатывает все методы одинаковым селектором, означает ли это, что независимо отмного разных объектов у меня есть, если у них у всех есть метод EatCake (), то все они будут использовать один и тот же селектор для EatCake?Если так, то почему они должны иметь одинаковые параметры и возвращаемый тип?

Тогда в следующей части говорится, что, хотя они представлены одним и тем же селектором, они могут иметь разные типы параметров и возвращаемые типы.Так что теперь я в полном замешательстве, я думал, что просто сказал, что это не тот случай.

Я не ожидаю, что это ошибка, я ожидаю, что я просто не понимаю, в чем разница между этими двумязаявления.

Может кто-нибудь объяснить это для меня?

Ответы [ 2 ]

4 голосов
/ 11 октября 2011

Не обязательно, чтобы все методы с одним и тем же селектором имели одинаковые параметры и возвращаемые типы.Селектор - это просто имя, которое идентифицирует метод без какой-либо прикрепленной информации.

Проблема в том, что компилятор должен знать, что такое параметр и возвращаемый тип, когда вы вызываете метод, чтобы он мог выполнитьпроверка типа для вас.Когда отрывок говорит о динамических получателях, он говорит о переменных с типом id и сообщениях, отправляемых в результате метода, который возвращает id.Поскольку это только говорит компилятору, что это объект, а не какой это класс, он не может определить, какой класс следует использовать для определения параметра и возвращаемых типов.Таким образом, единственный способ узнать, есть ли у всех пользователей этого селектора один и тот же параметр и типы возвращаемых значений.

Выдержка также объясняет, что исключение относится к статически типизированным получателям, что означает, что вы указали определенный класстип вашей переменной, такой как NSString *myString.Поскольку компилятор знает, что объект должен быть объектом NSString, он знает, что должен использовать параметр и возвращаемые типы из этого класса, поэтому он не должен быть одинаковым для объектов другого класса.

Все это абсолютно не влияет на время выполнения.Когда вы вызываете метод, среда выполнения получает этот объект фактическим классом и использует его, чтобы найти правильную реализацию для вызова.Он не выполняет проверку типов, поэтому его не волнует, что является параметром и типом возвращаемого значения.

0 голосов
/ 31 августа 2012

Вооружены следующими ссылками:

и набор экспериментов, я пришел к следующему удивительному (для меня!) Выводу, что не может быть двух методов с точно таким же селектором, но с другим параметром /возвращаемые типы. И это справедливо в глобальном масштабе.

Второе утверждение вызывает удивление.Мы знаем , что в Objective C не может быть перегрузки методов (" Один селектор для данного класса может иметь только одну сигнатуру типа. "), поэтому он сохраняется локально.Но также не может быть двух разных не связанных классов с одним и тем же селектором, но разными:

У меня есть скрытое подозрение, что мое заключение может быть не совсем правильным, поэтому, если вы знаете лучше, скажите.

...