Как расшифровать сигнатуру метода в Objective-C

Разница между вызовом метода и отправкой сообщения

Метод и сообщение отличаются друг от друга. В ООП есть две школы того, как делается обращение к объекту.
  1. Первая (C++-школа) предполагает, что метод, который мы вызываем, является неотъемлемым свойством объекта. Мы выбираем метод среди всех полей объекта (в C++ оператор '->' официально даже называется «селектор»), а затем вызываем его. Самое главное здесь в том, что метода не существует, если объект равен null, т. е. ситуация, когда мы пытаемся вызвать метод на null, эквивалентна ошибке.
  2. Вторая (Smalltalk-школа, именно этот подход реализован в Objective-C) предполагает, что сообщение отделено от объекта, который его получает. Объект, получив сообщение, может на него отреагировать или нет. Поэтому, кстати, если вы в *.h забыли вписать сигнатуру метода, реализованного в *.m, то в том месте, где вы его вызываете, будет не ошибка компиляции, а всего лишь предупреждение — есть другие способы перехватить сообщение, кроме как посредством реализации метода. Ещё одно отличие состоит в том, что отправка сообщения объекту nil является допустимой. А в самом Smalltalk nil — это вообще объект, экземпляр класса Nil.
Так что не путайте сообщение с методом, это не одно и то же.

Синтаксис определения и вызова методов в Objective-C

В 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];
Такая нотация используется крайне редко.