Селектор представляет имя метода, а не сигнатуру метода.В следующем примере:
- (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 .