Чтобы отправить сообщение объекту, используется выражение сообщения, которое также называют для простоты и по аналогии с функциями С вызовом метода.

Как вы уже и сами догадались, синтаксис отправки сообщения объекту включает использование квадратных скобок. Первым в квадратных скобках указывается объект, которому отправляется сообщение; этот объект является получателем сообщения. Затем следует само сообщение:

NSString* s2 = [s uppercaseString]; // Отправка сообщения
// "uppercaseString" объекту s и присваивание
// результата переменной s2

Если сообщение представляет собой метод, который получает параметры, значение каждого соответствующего аргумента указывается после двоеточия:

[myStackl push: @"Hello"]; // Отправка объекту myStackl
// сообщения "push:" с одним аргументом типа
// NSString и значением @"Не11о"

Чтобы отправить сообщение классу (вызов метода класса), класс может быть представлен его именем:

NSString* s = [NSString string]; // Сообщение "string"
// для класса NSString

Для отправки сообщения экземпляру (вызов метода экземпляра) требуется ссылка на этот экземпляр, которая (как вы знаете) представляет собой указатель:

NSString* s           //            s инициализируется как
= @"Hello,            world!"; //            экземпляр класса NSString
NSString* s2         //            Отправка сообщения
= [s uppercaseString];        //            "uppercaseString" объекту s

Можно отправлять метод класса классу, а метод экземпляра экземпляру, независимо от того, как получен и представлен этот класс или экземпляр. Например, строка @"Hello, world! " сама по себе является экземпляром NSString, так что вполне можно написать

NSString* s2 = [@"Hello, world!" uppercaseString];

Если метод не принимает никаких параметров, то его имя не содержит двоеточия, как, например, метод экземпляра uppercaseString класса NSString. Если метод принимает один параметр, то его имя содержит одно двоеточие, которое представляет собой последний символ имени метода, наподобие метода экземпляра push: нашего гипотетического стека. Если метод принимает два и более параметра, его имя содержит соответствующее количество двоеточий и последнее двоеточие является последним символом имени метода. В минимальном случае имя метода заканчивается всеми его двоеточиями. Например, метод, принимающий три параметра, может называться hereAreThreeStrings : : :. Для того чтобы его вызвать, мы должны разбить имя и поместить после каждого двоеточия аргумент, т.е. получить выражение наподобие следующего:

[someObject hereAreThreeStrings: @"stringl" : 0"string2" : @"string3"];

Это вполне корректный вызов метода, хотя и не очень распространенный, главным образом потому, что он не слишком информативный. Обычно применение имени более информативно, так что, как правило, перед каждым двоеточием идет часть имени, описывающая значение, следующее за двоеточием.

Например, вот метод класса UlColor, генерирующий экземпляр UlColor из четырех чисел CGFloat, представляющих красный, зеленый, синий компоненты и прозрачность, и он называется colorWithRed: green: blue: alpha:. Обратите внимание на ясность конструкции этого имени. Часть colorWith говорит о предназначении метода: он генерирует цвет на основе некоторой информации. Остальная часть имени, Red: green: blue: alpha:, описывает смысл каждого параметра. Вы можете вызвать этот метод таким способом:

UlColor* с = [UlColor colorWithRed: 0.0 green: 0.5 blue: 0.25 alpha: 1.0];

В этой главе я уже ссылался несколько раз на метод класса NSString с именем stringWi thContentsOf File: encoding: error:. Это имя весьма информативно. Даже до изучения типов данных параметров мы можем предположить, что первый параметр представляет собой ссылку на файл, второй описывает кодировку, а третий используется для возврата информации об ошибке путем косвенного обращения (и что этот метод возвращает строку).

Правила именования методов Objective-C, вместе с соглашениями, регулирующими применение таких имен (наподобие сделать имя информирующим о предназначении метода и его параметров), приводят к довольно длинным и громоздким именам методов, например, таким: getBytes:maxLength:usedLength:encoding:options:range:remainingRa nge:. Такая многословность является характерной для Objective-C. Вызовы методов и даже объявления методов часто разделены на несколько строк, как для ясности, так и для предотвращения насильственного переноса редактором строки кода.


 

 

 

Добавить комментарий