Программирование на Objective-C 2.0
Шрифт:
Если вызывается функция, которая определена после самого вызова или находится в другом файле, то необходимо включить объявление прототипа для этой функции, которое имеет следующий общий формат. возвращаемыйТип имя (тип1 парам 1, тип2 парам2, .. )
Это указывает компилятору тип возвращаемого значения функции, число аргументов, которое она принимает, и тип каждого аргумента. Например, в строке long double power (double x, int n);
содержится объявление power как функции, которая возвращает значение типа long double и принимает два аргумента типа double и типа int. Имена аргументов внутри круглых скобок на самом деле являются фиктивными именами, и они могут
Если компилятор уже встретил определение функции или объявление про-тотипа для этой функции, то при вызове функции тип каждого аргумента пре-образуется (там, где возможно) в соответствии с типом, который объявлен в функции.
Если компилятор не встретил ни определения функции, ни объявления про-тотипа, то он предполагает, что функция возвращает значение типа int, автома-тически преобразует все аргументы типа float в тип double и выполняет целочисленное расширение любых целых аргументов, как описано выше в разделе «Преобразование базовых типов данных». Другие аргументы функции передаются без преобразования.
Функции, которые принимают переменное число аргументов, должны быть объявлены соответствующим образом. В противном случае компилятор будет предполагать, что функция принимает фиксированное число аргументов, ос-новываясь на числе аргументов, фактически использованных при вызове фун-кции.
Если функция была определена в старом формате (см. выше раздел «Определение функции»), то объявление для такой функции имеет следующий формат. возвращаемыйТип имя ;
Аргументы, передаваемые такой функции, преобразуются в соответствии с описанием в предыдущем абзаце.
Для функций, возвращаемый тип которых объявлен как void, компилятор выводит сообщение для любых вызовов, где делается попытка использования возвращаемого значения.
Все аргументы передаются функции по их значению, поэтому их значения не могут быть изменены функцией. Но если функции передается указатель, то функция может изменить значения, которые указываются этим указателем, но она все же не может изменить значение самой переменной-указателя. Указатели на функции
Имя функции без последующей пары круглых скобок создает указатель на эту функцию. К имени функции можно также применить адресный оператор, что-бы создать указатель на эту функцию.
Если fp — указатель на функцию, то соответствующую функцию можно вызвать, написав fp
или (*fp) Если функция принимает аргументы, они должны быть указаны в круглых скобках. Классы
В этом разделе приводятся сведения о синтаксисе и семантике классов. Определение класса
В определение класса включается объявление переменных экземпляра и мето-дов в секции interface, а также определение кода для каждого метода в секции implementation. Секция interface Общий формат @interface имяКласса: родительскийКласс <протокол, ...> { объявления ПеременныхЭкземлляра } объявлениеМегода объявлениеМегода @end
Класс имяКласса объявляется с помощью родительского класса родительс-кийКласс. Если имяКласса принимает также один или несколько формальных протоколов, то имена протоколов перечисляются в угловых скобках после ро-дительского класса. В этом случае соответствующая секция implementation должна содержать определения всех методов из перечисленных протоколов.
Если двоеточие и родительскийКласс не указаны, это означает, что объявляется новый корневой класс. Объявления переменных экземпляра
В необязательной
Методы класса не имеют доступа к переменным экземпляра. Объявления свойств
Общий формат @property {атрибуты) списокИмен-,
Объявляются свойства с помощью заданного списка атрибутов с разделите лями-запятыми.
списокИмен — это список с разделителями-запятыми, содержащий имена свойств объявляемого типа. {тип) имяСвойства1, имяСвойства2, имяСвойстваЗ,...
Директива @property может присутствовать в любом месте секции объявления метода для класса, протокола или категории.
Табл. В.7. Атрибуты свойств Атрибут Описание assign Используется простое присваивание, чтобы задать значение переменной экземпляра в методе-установщике (setter). (Это атрибут по умолчанию.) сору Используется метод сору, чтобы задать значение переменной экземпляра. getter=имя Используется имя для имени метода-получателя (getter) вместо имени имяСвойства, которое используется по умолчанию для синтезируемого метода-получателя. nonatomic Значение может быть возвращено непосредственно из синтезируемого метода-получателя. Если этот атрибут не объявлен, то методы доступа (accessor) действуют с атрибутом atomic; это означает, что доступ к переменным экземпляра защищен блокировкой mutex. Это обеспечивает защиту в среде с несколькими потоками за счет того, что операция get или set выполняется только в одном потоке. Кроме того, по умолчанию в среде без сборки мусора синтезируемый метода-получатель будет удерживать (retain) и автоматически высвобождать (autorelease) свойство, прежде чем возвратить его значение. ~fwrite Значение свойства можно читать и задавать. Компилятор предполагает, что вы сами предоставили метод-получатель и метод-установщик (getter и setter), или он будет синтезировать оба метода, если используется директива @synthesize. retain Свойство должно удерживаться (retain) во время присваивания. Этот атрибут можно указывать только для типов Objective-C. setter=имя Используется имя для имени метода-установщика (setter) вместо заданного имени имяСвойства, которое используется по умолчанию для синтезируемого метода доступа.
Можно указывать только один из атрибутов assign, сору или retain. Если у вас не используется сборка мусора, то один из этих атрибутов должен быть использован явным образом; в противном случае вы получите предупреждение от компилятора. Если у вас используется сборка мусора и вы не указали один из этих трех атрибутов, то будет применяться атрибут по умолчанию assign. В этом случае компилятор выдаст предупреждение, только если данный класс подчиняется протоколу NSCopying (в этом случае для свойства может потребоваться атрибут сору, а не assign). Если вы используете атрибут сору, то синтезируемый метод-установщиком применяет метод сору данного объекта. Это дает немутабельную копию. Если вам требуется мутабсльная копия, то вы можете предоставить вместо этого свой собственный метод-установщик. Объявление метода