Разница между вызовом метода и отправкой сообщения
Метод и сообщение отличаются друг от друга. В ООП есть две школы того, как делается обращение к объекту.- Первая (C++-школа) предполагает, что метод, который мы вызываем, является неотъемлемым свойством объекта. Мы выбираем метод среди всех полей объекта (в C++ оператор '->' официально даже называется «селектор»), а затем вызываем его. Самое главное здесь в том, что метода не существует, если объект равен null, т. е. ситуация, когда мы пытаемся вызвать метод на null, эквивалентна ошибке.
- Вторая (Smalltalk-школа, именно этот подход реализован в Objective-C) предполагает, что сообщение отделено от объекта, который его получает. Объект, получив сообщение, может на него отреагировать или нет. Поэтому, кстати, если вы в *.h забыли вписать сигнатуру метода, реализованного в *.m, то в том месте, где вы его вызываете, будет не ошибка компиляции, а всего лишь предупреждение — есть другие способы перехватить сообщение, кроме как посредством реализации метода. Ещё одно отличие состоит в том, что отправка сообщения объекту nil является допустимой. А в самом Smalltalk nil — это вообще объект, экземпляр класса Nil.
В Objective-C каждый параметр имеет название. Оно указывается как при вызове, так и при определении метода. Первый параметр метода названия не имеет. Вот так: все параметры названы, а первый — нет. Название первого параметра стали выносить в название метода. Например: findUserByNickname, locateByCoordinates, storeIntoFilename, loadFromTable, setupById и так далее.
Например, определение метода с множеством параметров:
- (float) calculateWithPrice:(float)price volume:(int)volumeAmount value:(int)value ticker:(TickerClass *)ticker { ... }Вызов этого метода:
price = [trade calculateWithPrice:25.55 volume:500 value:3 ticker:aaplTicker];
Objective-C позволяет и никак не называть параметры:
- (void)funkyMethod:(int)param1 :(int)param2 :(int)param3;с соответствующим вызовом:
[object funkyMethod:1 :2 :3];
Такая нотация используется крайне редко.