Вопрос о динамическом связывании, Objective C и методах

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

Тогда есть что-то в методах "статического типа", являющихся исключением.

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


person AndIWonder    schedule 07.07.2011    source источник


Ответы (1)


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

- (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.

person Community    schedule 07.07.2011
comment
А... Спасибо. Спасибо. Просто нужно быть осторожным с переменными типа 'id', а также избегать называть два метода одним и тем же именем, если они не связаны и имеют одинаковую сигнатуру. PS: Мне действительно нужно зарегистрироваться, чтобы я мог голосовать. - person AndIWonder; 07.07.2011
comment
@ И это не проблема, если методы имеют одинаковую сигнатуру. Это может быть проблемой, если методы имеют одинаковое имя, но различную сигнатуру. И даже если вы не объявляете свои переменные как id, есть несколько методов фреймворка, тип возвращаемого значения которых — id, так что вы можете попасть в беду, даже не заметив этого. - person ; 07.07.2011
comment
Спасибо за предупреждение. Пришел из Java, где компилятор делает все возможное, чтобы вы не выстрелили себе в ногу. Свободный набор текста здесь немного культурный шок. ржу не могу - person AndIWonder; 08.07.2011
comment
Привет, @Bavarious, меня все еще смущает одна вещь: почему среда выполнения не может привязать метод к нужному объекту, даже если объект является id? насколько я понимаю, dynamic binding или dynamic typing заключается в том, что компилятор не может узнать, какой объект стоит за id, но среда выполнения должна знать это и выбирать правильный объект в качестве получателя сообщения. но когда среда выполнения не может этого сделать? - person neevek; 27.02.2012