Чтение онлайн

ЖАНРЫ

Программирование на Objective-C 2.0
Шрифт:

Каждое определениеМетода содержит код, который будет выполняться при вызове этого метода. Определение метода

Общий формат мТип (возвращаемый Тип) имя1: (тип1) парам 1: имя2(тип2) парам2, ... { обьявленияПеременных программныйОператор программныйОператор return выражение; }

Определяется метод имя1:имя2:.., который возвращает значение типа возвращаемыйТип и имеет формальные параметры парам}, парам2,....; парам} объявляется с типом тип}, парам2с типом тип2, и т.д. Если в качестве мТип указан знак +, это означает, что определяется метод класса, а если знак то определяется метод экземпляра. Это объявление

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

В методе экземпляра можно обращаться к переменным экземпляра данного класса и любым переменным, которые унаследованы этим методом непосред-ственно по имени. Если определяется метод класса, он не может обращаться к каким-либо переменным экземпляра.

Внутри метода можно использовать идентификатор self для ссылки на объект, для которого вызывается метод, то есть на получателя сообщения. Внутри метода можно использовать идентификатор super для ссылки на родительский класс объекта, для которою вызывается метод.

Если возвращаемыйТип не указан как void, то в определении метода должны содержаться один или несколько операторов relume выражениями типа возвра-щаемыйТип. Если возвращаемыйТип указан как void, использовать оператор return не обязательно, и в случае использования он не может содержать возвращаемого значения.

Ниже приводится пример определения метода, где определяется метод setNumerator:andDenominator: в соответствии с его объявлением (см. выше раздел «Объявление метода»), -(void) setNumerator: (int) n andDenominator: (int) d { numerator = n; denominator = d; }

В этом методе двум его переменным экземпляра присваиваются передавае-мые аргументы и не выполняется оператор return (хотя это можно сделать), по-скольку в объявлении метода он не возвращает никакого значения.

В объявлениях для аргументов одномерных массивов не обязательно указывать число элементов этого массива. Для многомерных массивов нужно обязательно указать размер каждой размерности, кроме первой.

Внутри метода можно объявлять локальные переменные, и они обычно объявляются в начале определения метода. Память для автоматических локальных переменных выделяется при вызове метода, и она освобождается при выходе из метода.

Описание оператора return см. ниже в разделе «Оператор return». Синтезируемые методы доступа

Общий формат @synthesize свойство1, свойство2, ...

Здесь указывается, что для перечисленных свойств свойство}, свойство2,... должны быть синтезированы методы доступа.

В списке можно использовать форму записи свойство = instance_var, чтобы ука-зать, что свойство будет связано с переменной экземпляра instanceуаг. Синтези-руемые методы будут иметь характеристики, базирующиеся на атрибутах, объявленных ранее для свойства с помощью директивы @property. Определение категории

Общий формат @interface имяКласса (имяКатегории) <протокол,...> объявлениеМетода объявлениеМетода @end

Здесь объявляется категория имяКатегории для класса имяКласса с перечислен-ными методами. Если указаны один или несколько протоколов, категория под-чиняется перечисленным протоколам.

Компилятору должно быть известно имяКласса из предшествующего объяв-ления в секции @interface для этого класса. Можно объявить любое число кате-горий влюбом числе различных исходных файлов. Перечисленные методы ста-новятся

частью данного класса и наследуются подклассами.

Категории уникально определяются парами ямяКласса/имяКатегории. Например, в определенной программе может быть только одна категория NSArray (Private). Но можно использовать одинаковые имена категорий. Например, определенная программа может содержать категорию NSArray (Private) и категорию NSString (Private), и это будут различные категории.

Вы не обязаны реализовать методы категории, которые не собираетесь ис-пользовать.

Категория может только расширять определение класса дополнительными методами или переопределять существующие методы этого класса. Она не мо-жет определять какие-либо новые переменные экземпляра для этого класса.

Если в нескольких категориях объявлен методе одним и тем же именем для одного класса, то нельзя определить, какой метод будет выполняться при вы-зове. Например, в следующем примере для класса Complex определяется катего-рия с именем ComplexOps, содержащая четыре метода экземпляра. #import «Complex.h» @interface Complex (ComplexOps) -(Complex *) abs; -(Complex *) exp; -(Complex *) log; -(Complex *) sqrt; @end

Можно предположить, что где-либо будет присутствовать секция implementation, в которой реализуются один ли несколько из этих методов. #import "ComplexOps.h" @implementation Complex (ComplexOps) -(Complex *) abs { } -(Complex *) exp { } -(Complex *) log { } -(Complex *} sqrt { } @end

Категория, содержащая методы, которые будут реализоваться другими подклассами, называется неформальным (informal) протоколом или абстрактной (abstract) категорией. В отличие от формальных протоколов, компилятор не выполняет никаких проверок на подчинение неформальному протоколу. На этапе выполнения объект может проверяться на подчиненность неформальному протоколу в зависимости от конкретного метода. Определение протокола

Общий формат @protocol имяПроюкола <протокол, ...> обьявленияМетодов @optional обьявленияМетодов @required обьявленияМетодов @end

Здесь определяется протокол имяПроюкола с указанными методами. Если включены другие протоколы, то протокол имяПротокола принимает (adopt) перечисленные протоколы.

Это определение называют также определением формального протокола. Класс подчиняется (conform) протоколу имяПротокола, если в нем определяются или наследуются все обязательные (required) методы, объявленные в этом протоколе, а также все методы любых других перечисленных протоколов. Компилятор проверяет подчиненность и выводит предупреждение, если класс не подчиняется объявленному формальному протоколу. На этапе выполнения объекты могут проверяться или Tie проверяться на подчиненность формальному протоколу.

Перед списком методов, реализация которых не обязательна, может ставиться директива @optional. В дальнейшем можно использовать директиву @required, чтобы обновить список обязательных методов, которые должны быть реализованы для подчинения протоколу.

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

Для типов параметров и возвращаемого значения методов, объявляемых в про-токолах, могут использоваться спецификаторы типов, которые приводятся в таблице В.8. Эти спецификаторы используются для распределенных объектных приложений.

Поделиться с друзьями: