Интернет магазин китайских планшетных компьютеров



Компьютеры - Objective-C - Синтаксис языка

06 июля 2011


Оглавление:
1. Objective-C
2. Синтаксис языка
3. Создание новых классов
4. Как работает механизм сообщений
5. Протоколы
6. Обработка исключений
7. Создание и уничтожение объектов
8. Управление памятью
9. Категории
10. Class objects и Objective-C runtime
11. Разное



В языке Objective-C для обозначения объектов используется специальный тип id. Переменная типа id фактически является указателем на произвольный объект. Для обозначения нулевого указателя на объект используется константа nil.

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

Тем самым язык поддерживает проверку типов, но в нестрогой форме.

Для посылки сообщений используется следующий синтаксис:

   ;

В этой конструкции receiver является указателем на объект, а message — именем метода.

В отличие от языка С++ посылка сообщения nil’у является законной операцией, всегда возвращающей нулевое значение.

Сообщение может также содержать параметры:

   ;

В этом примере именем метода является setOrigin::. Обратите внимание, что каждому передаваемому аргументу соответствует ровно одно двоеточие. При этом в приведенном примере первый аргумент имеет метку, а второй — нет.

Язык Objective-C позволяет снабжать метками каждый аргумент, что заметно повышает читаемость кода и снижает вероятность передачи неправильного параметра.

   ;

В этом примере в качестве имени сообщения выступает setWidth:height:.

Также поддерживается возможность передачи произвольного количества аргументов в сообщении:

   ;

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

   float area = ;

Результат одного сообщения можно сразу же использовать в другом сообщении:

   ];

Как уже говорилось, в Objective-C классы сами являются объектами. Основной задачей таких объектов является создание экземпляров данного класса.

При этом само имя класса играет двойную роль — с одной стороны оно выступает как тип данных. А с другой стороны имя класса может выступать в качестве объекта, которому посылается сообщение.

   Rect * myRect =  init];

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

Первым достаточно серьёзным применением языка Objective-C было его использование в операционной системе NextStep. Для этой системы было написано большое количество различных классов на Objective-C, многие из которых до сих пор используются в Mac OS X.

Имена всех этих классов начинаются с префикса NS, обозначающего свою принадлежность к операционной системе NextStep.

С одним из них — NSString — мы столкнемся в данной статье. Этот класс служит для работы со строками.

Компилятор поддерживает данный тип, автоматически переводя конструкции вида @"my string" в указатель на объект класса NSString, содержащий данную строку.

Свойства

Допустим в классе Company существует instance-переменная name.

@interface Company : NSObject
{
     NSString *name;
}

Для доступа к ней извне лучше всего воспользоваться свойствами, которые появились в Objective C 2.0. Для декларации свойств используется ключевое слово @property.

@property  NSString *name;

В скобках перечисляются атрибуты доступа к instance-переменной. Атрибуты разделяются на 3 группы.

Имена акцессора и мутатора

  • getter=getterName, используется для задания имени функции, используемой для извлечения значения instance-переменной.
  • setter=setterName, используется для задания имени функции, используемой для установки значения instance-переменной.

Ограничение чтения/записи

  • readwrite - у свойства есть как акцессор, так и мутатор.
  • readonly - у свойства есть только акцессор.

И последняя группа атрибуты акцессора.

  • assign - для задания нового значения используется оператор присваивания. Используется только для POD-типов либо для объектов которыми мы не владеем.
  • retain - указывает на то, что для объекта, используемого в качестве нового значения instance-переменной, управление памятью происходит вручную.
  • copy - указывает на то, что для присваивания будет использована копия переданного объекта.

При работе под GC никакой разницы между использованием assign, retain, copy нет. Для создания кода свойств, в соответствии с тем как они описаны в декларации, можно воспользоваться автогенерацией кода:

@synthesize name;

Автоматически созданный код не всегда подходящее решение и может потребоваться создание методов доступа к instance-переменным вручную.



Просмотров: 11398


<<< Mission Control
Photo Booth >>>