Чтобы отправить сообщение объекту, используется выражение сообщения, которое также называют для простоты и по аналогии с функциями С вызовом метода.
Как вы уже и сами догадались, синтаксис отправки сообщения объекту включает использование квадратных скобок. Первым в квадратных скобках указывается объект, которому отправляется сообщение; этот объект является получателем сообщения. Затем следует само сообщение:
Если сообщение представляет собой метод, который получает параметры, значение каждого соответствующего аргумента указывается после двоеточия:
Чтобы отправить сообщение классу (вызов метода класса), класс может быть представлен его именем:
Для отправки сообщения экземпляру (вызов метода экземпляра) требуется ссылка на этот экземпляр, которая (как вы знаете) представляет собой указатель:
Можно отправлять метод класса классу, а метод экземпляра экземпляру, независимо от того, как получен и представлен этот класс или экземпляр. Например, строка @"Hello, world! " сама по себе является экземпляром NSString, так что вполне можно написать
Если метод не принимает никаких параметров, то его имя не содержит двоеточия, как, например, метод экземпляра uppercaseString класса NSString. Если метод принимает один параметр, то его имя содержит одно двоеточие, которое представляет собой последний символ имени метода, наподобие метода экземпляра push: нашего гипотетического стека. Если метод принимает два и более параметра, его имя содержит соответствующее количество двоеточий и последнее двоеточие является последним символом имени метода. В минимальном случае имя метода заканчивается всеми его двоеточиями. Например, метод, принимающий три параметра, может называться hereAreThreeStrings : : :. Для того чтобы его вызвать, мы должны разбить имя и поместить после каждого двоеточия аргумент, т.е. получить выражение наподобие следующего:
Это вполне корректный вызов метода, хотя и не очень распространенный, главным образом потому, что он не слишком информативный. Обычно применение имени более информативно, так что, как правило, перед каждым двоеточием идет часть имени, описывающая значение, следующее за двоеточием.
Например, вот метод класса UlColor, генерирующий экземпляр UlColor из четырех чисел CGFloat, представляющих красный, зеленый, синий компоненты и прозрачность, и он называется colorWithRed: green: blue: alpha:. Обратите внимание на ясность конструкции этого имени. Часть colorWith говорит о предназначении метода: он генерирует цвет на основе некоторой информации. Остальная часть имени, Red: green: blue: alpha:, описывает смысл каждого параметра. Вы можете вызвать этот метод таким способом:
В этой главе я уже ссылался несколько раз на метод класса NSString с именем stringWi thContentsOf File: encoding: error:. Это имя весьма информативно. Даже до изучения типов данных параметров мы можем предположить, что первый параметр представляет собой ссылку на файл, второй описывает кодировку, а третий используется для возврата информации об ошибке путем косвенного обращения (и что этот метод возвращает строку).
Правила именования методов Objective-C, вместе с соглашениями, регулирующими применение таких имен (наподобие сделать имя информирующим о предназначении метода и его параметров), приводят к довольно длинным и громоздким именам методов, например, таким: getBytes:maxLength:usedLength:encoding:options:range:remainingRa nge:. Такая многословность является характерной для Objective-C. Вызовы методов и даже объявления методов часто разделены на несколько строк, как для ясности, так и для предотвращения насильственного переноса редактором строки кода.