Objective-C

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 20:02, 1 июня 2016.
Objective-C
Парадигма мультипарадигменный: Рефлексивно-ориентипрванный, объектно-ориентированный
Спроектировано Бред Кокс
Первый   появившийся 1983
Печать дисциплины динамическая, статическая, слабая
OS Кроссплатформенное
Расширение файла .h, .m, .mm, .C
Портал: https://developer.apple.com/
Под влиянием
C, Smalltalk
Влияние
Java, Nu, Objective-J, TOM, Swift

Objective-C - объектно-ориентированный язык программирования, построенный на основе языка С, и парадигм Smaltalk. Основной язык используемый корпорацией Apple, для операционных систем OS X и iOS, и их программных интерфейсов совместимых с Cocoa и Cocoa Touch. Файлы с кодом реализации на языке Objective-C имеет расширение .m, а заголовочные файлы и файлы интерфейсов имеют расширение .h, так же как и заголовочные файлы в языке C. Файлы с кодом реализации на языке Objective-C++ имеет расширение .mm.

Характеристики Objective-C

  1. Класс объявляется в двух разных секциях - @interface и @implementation.
  2. Почти все в виде объектов.
  3. Объекты получают сообщения и часто называются получателем.
  4. Объект содержит переменные экземпляра.
  5. Объекты и переменные имеют границы.
  6. Классы скрывают реализацию объекта.
  7. Свойства используются для обеспечения доступа к экземпляру класса переменных в других классах.

Классы и объекты

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

Определение класса

Определение класса начинается с ключевого слова @interface, после чего следует имя класса и тело класса, заключенная в фигурных скобках. В Objective-C все классы унаследованы от основного класса NSObject. Это родительский класс всех классов в Objective-С. Он обеспечивает основные методы: выделение памяти, инициализация. Ниже приведен пример определения класса Box:

 @interface Box:NSObject
 {
     //Instance variables
     double m_length;   // Length of a box
     double m_breadth;  // Breadth of a box
 }
 @end

Члены-переменные являются частными и доступны только внутри реализации класса.

Определение методов

Общая форма определения метода на языке программирования Objective-C выглядит следующим образом:

 - ('''<возвращаемый_тип>''') ''<имя_метода>'':( '''<тип_аргумента_1>''' )<имя_аргумента_1> 
 <дополнительный_аргумент_2>:( '''<тип_аргумента_2>''' )<имя_аргумента_2> 
 ... 
 <дополнительный_аргумент_N>:( '''<тип_аргумента_N>''' ) <имя_аргумента_N> 
 {
    <тело_метода>
 }

Определение метода состоит из заголовка метода и его тела.

  1. Каждый метод начинается со знака тире (-) или плюс (+). Тире используется для определения методов объекта. Плюс используется для определения методов класса.
  2. Возвращаемый тип: Тип который возвращает метод. Есть методы которые выполняют операции, но не возвращают ничего. "возвращаемый_тип" определяется как "void".
  3. Имя метода: Фактическое имя метода. Имя метода и параметры которые принимает метод вместе называется сигнатурой.
  4. Аргументы: Когда функция вызывается, передаются значения аргументов. Список параметров относится к типу, порядку и количеству аргументов метода. Список аргументов не является обязательным. Метод может не содержать никаких аргументов.
  5. Дополнительный аргумент: Используется для упрощения чтения.
  6. Тело метода: команды которые выполняет метод. Реализация метода.

Ниже приведен код реализации метода max(). Этот метод получает два параметра: num1 и num2, и возвращает больший из них:

@interface SampleClass:NSObject
/* method declaration */
 - (int)max:(int)num1 andNum2:(int)num2;
 @end
 @implementation SampleClass
 - (int) max:(int) num1 secondNumber:(int) num2 
 {
    /* local variable declaration */
    int result;
    if (num1 > num2)
       result = num1;
    else
       result = num2;
    return result; 
 }
 @end

Для вызова метода необходимо передать ему список параметров после имени метода, и можно сохранить значение возвращаемое методом. Например:

 int ret = [sampleClass max:150 andNum2:200];

Использование объектов Objective-C

Объект создается из класса. Объект класса объявляется точно с так же, как и переменные основных типов. Свойства объектов класса можно получить с помощью оператора прямого доступа (.). Ниже приведен пример объявления двух объектов типа Box:

 #import <Foundation/Foundation.h>
 @interface Box:NSObject
 {
     double length;   // Length of a box
     double breadth;  // Breadth of a box
     double height;   // Height of a box
 }
 @property(nonatomic, readwrite) double height; // Property
 -(double) volume;
 @end
 @implementation Box
 @synthesize height;
 -(id)init
 {
    self = [super init];
    length = 1.0;
    breadth = 1.0;
    return self;
 }
 -(double) volume
 {
    return length*breadth*height;
 }
 @end
 int main( )
 {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    
    Box *box1 = [[Box alloc]init];    // Create box1 object of type Box
    Box *box2 = [[Box alloc]init];    // Create box2 object of type Box
    double volume = 0.0;     // Store the volume of a box here
    // box 1 specification
    box1.height = 5.0; 
    // box 2 specification
    box2.height = 10.0;
    // volume of box 1
    volume = [box1 volume];
    NSLog(@"Volume of Box1 : %f", volume);
    // volume of box 2
    volume = [box2 volume];
    NSLog(@"Volume of Box2 : %f", volume);
    [pool drain];
    return 0;
 }

Свойства

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

  1. Свойства начинаются с ключевого слова @property.
  2. Спецификаторы бывают "atomic" или "nonatomic", "readwrite" или "readonly" и "strong", "unsafe_unretained" или "weak". Это зависит от типа переменной. Для указателя можно использовать с"strong", "unsafe_unretained" или "weak". Для других типов "readwrite" или "readonly".
  3. Зависит от типа данных.
  4. В конце ставится точка с запятой.

Наследование

Objective-C, очевидно, реализует понятие наследования, но не поддерживает множественное наследование.

С++:

 class Foo : public Bar, protected Wiz
 {
 }

Objective-C:

 @interface Foo : Bar 
 {
 }
 @end

Используется другая техника, чтобы наследовать еще и от класса "Wiz". В языке С++, класс может быть получен из одного или нескольких классов используя режимы "public", "protected" или "private". При вызове метода, можно ссылаться на родительский класс с помощью оператора разрешения контекста :: (Bar::, Wiz::). В Objective-C, класс можно получить только из одного класса с использованием режима "public". При вызове метода, можно ссылаться на родительский класс с помощью ключевого слова "super", как в языке Java.

Формальный протокол

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

C++:

 class MouseListener
 {
     public:
          virtual bool mousePressed(void) = 0; //pure virtual method
          virtual bool mouseClicked(void) = 0; //pure virtual method
 };
 class KeyboardListener
 {
      public:
           virtual bool keyPressed(void) = 0; //pure virtual method
 };
 class Foo : public MouseListener, public KeyboardListener 
 {
      ...
 }

В языке C++, протоколы реализованы как абстрактные классы и чисто виртуальные методы. Абстрактный класс в С++ является более "мощным", чем протокол в Objective-C, поскольку он может хранить данные.

Objective-C:

 @protocol MouseListener
      -(BOOL) mousePressed;
      -(BOOL) mouseClicked;
 @end
 @protocol KeyboardListener
      -(BOOL) keyPressed;
 @end
 @interface Foo : NSObject <MouseListener, KeyboardListener>
 {
     ...
 }
 @end

Класс "Foo" должен реализовать mousePressed, mouseClicked и keyPressed. Класс может быть использован как "наблюдатель" мыши и клавиатуры. В Objective-C, протокол является специальным понятием. Треугольные скобки <...> не используются как шаблоны в С++. Это особенность которой нет в Objective-C.

Преимущества и недостатки

В C++, несколько модификаторов могут быть добавлены к прототипу функции. Ни один из них не существует в Objective-C. Вот список:

  • const: метод не может быть const.
  • static: разница между методом класса и методом объекта реализована с помощью использования знаков + и - перед прототипом метода.
  • virtual: методы Objective-C виртуальные, поэтому ключевое слово не имеет смысла. чисто виртуальные методы реализуются с помощью формальных протоколов.
  • throw: В C++, метод можно ограничить, чтобы передать исключение. Это не обязательно в Objective-C.
  • friend: Objective-C нет классов "friend". Это, довольно, удобно использовать C++ для эффективной перегрузки операторов, которой нет в Objective-C.
  • Ссылки: В Objective-C нет ссылок (&).
  • Встраивание: в Objective-C нет встраивания. Однако встраивание очень удобно использовать для функций написанных на языке С, таких как max(), min()... Эта проблема решена в языке Objective-C++.
  • Шаблоны: в Objective-C нет шаблонов.
  • Перегрузка операторов: В Objective-C нет перегрузки операторов.

Список литературы

  1. Programming with Objective-C
  2. Learn Objective-C in 30 minutes
  3. Pierre Chatelier, From C++ to Objective-C
  4. Objective-C