Objective-C
Последнее изменение этой страницы: 20:02, 1 июня 2016.
Парадигма | мультипарадигменный: Рефлексивно-ориентипрванный, объектно-ориентированный |
---|---|
Спроектировано | Бред Кокс |
Первый появившийся | 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
- Класс объявляется в двух разных секциях - @interface и @implementation.
- Почти все в виде объектов.
- Объекты получают сообщения и часто называются получателем.
- Объект содержит переменные экземпляра.
- Объекты и переменные имеют границы.
- Классы скрывают реализацию объекта.
- Свойства используются для обеспечения доступа к экземпляру класса переменных в других классах.
Классы и объекты
Основная цель языка 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>
{
<тело_метода>
}
Определение метода состоит из заголовка метода и его тела.
- Каждый метод начинается со знака тире (-) или плюс (+). Тире используется для определения методов объекта. Плюс используется для определения методов класса.
- Возвращаемый тип: Тип который возвращает метод. Есть методы которые выполняют операции, но не возвращают ничего. "возвращаемый_тип" определяется как "void".
- Имя метода: Фактическое имя метода. Имя метода и параметры которые принимает метод вместе называется сигнатурой.
- Аргументы: Когда функция вызывается, передаются значения аргументов. Список параметров относится к типу, порядку и количеству аргументов метода. Список аргументов не является обязательным. Метод может не содержать никаких аргументов.
- Дополнительный аргумент: Используется для упрощения чтения.
- Тело метода: команды которые выполняет метод. Реализация метода.
Ниже приведен код реализации метода 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 для того, чтобы переменную экземпляра класса можно было получить за пределами класса. Основные свойства:
- Свойства начинаются с ключевого слова @property.
- Спецификаторы бывают "atomic" или "nonatomic", "readwrite" или "readonly" и "strong", "unsafe_unretained" или "weak". Это зависит от типа переменной. Для указателя можно использовать с"strong", "unsafe_unretained" или "weak". Для других типов "readwrite" или "readonly".
- Зависит от типа данных.
- В конце ставится точка с запятой.
Наследование
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 нет перегрузки операторов.
ISSN 2542-0356
Следуй за Полисом
Оставайся в курсе последних событий
Лицензия
Если не указано иное, содержание этой страницы доступно по лицензии Creative Commons «Attribution-NonCommercial-NoDerivatives» 4.0, а примеры кода – по лицензии Apache 2.0. Подробнее см. Условия использования.