Вопрос о динамическом связывании, Objective C и методах - PullRequest
0 голосов
/ 07 июля 2011

Согласно руководству Apple по Objective C, все методы с одинаковым именем используют один и тот же селектор, и им необходимо иметь одинаковый тип возвращаемого значения и параметры.

Тогда есть кое-что о "статической типизации"исключение составляют методы.

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

1 Ответ

6 голосов
/ 07 июля 2011

Селектор представляет имя метода, а не сигнатуру метода.В следующем примере:

- (void)someMethod:(int)intParam;
- (id)someMethod:(float)floatParam;

оба метода имеют одинаковые имена (someMethod:) и, следовательно, один и тот же селектор: @selector(someMethod:).

Предположим, вы объявили первыйметод в классе с именем Foo и второй метод в классе с именем Bar.Затем:

Foo *foo = …;
Bar *bar = …;

[foo someMethod:42];
[bar someMethod:3.1416f];

являются примерами вызовов метода «статической типизации», поскольку компилятору понятно, какой метод следует использовать, поскольку foo и bar статически типизированы.

Теперьрассмотрим следующее:

id foobar = …;

[foobar someMethod:42];

Поскольку foobar имеет тип id, который является универсальным типом объекта Objective-C, у компилятора недостаточно информации, чтобы решить, какой метод вызывается.Он выберет один из этих двух методов, который может быть опасным в зависимости от различий между типами возвращаемых данных и типами параметров.Вот почему Apple рекомендует, чтобы методы с одинаковым именем тоже имели одинаковую подпись.Мэтт Галлахер написал в блоге сообщение о ловушках слабой типизации в Objective-C .

...