Учебники

Objective-C Классы и Объекты

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

Класс используется для указания формы объекта, и он объединяет представление данных и методы для манипулирования этими данными в одном аккуратном пакете. Данные и методы в классе называются членами класса.

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

  • Класс определяется в двух разных разделах, а именно: @interface и @implementation .

  • Почти все в форме объектов.

  • Объекты получают сообщения, а объекты часто называют получателями.

  • Объекты содержат переменные экземпляра.

  • Объекты и переменные экземпляра имеют область видимости.

  • Классы скрывают реализацию объекта.

  • Свойства используются для предоставления доступа к переменным экземпляра класса в других классах.

Класс определяется в двух разных разделах, а именно: @interface и @implementation .

Почти все в форме объектов.

Объекты получают сообщения, а объекты часто называют получателями.

Объекты содержат переменные экземпляра.

Объекты и переменные экземпляра имеют область видимости.

Классы скрывают реализацию объекта.

Свойства используются для предоставления доступа к переменным экземпляра класса в других классах.

Определения класса Objective-C

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

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

@interface Box:NSObject {
   //Instance variables
   double length;    // Length of a box
   double breadth;   // Breadth of a box
}
@property(nonatomic, readwrite) double height;  // Property

@end

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

Выделение и инициализация объектов Objective C

Класс предоставляет чертежи для объектов, поэтому в основном объект создается из класса. Мы объявляем объекты класса точно так же, как мы объявляем переменные базовых типов. Следующие операторы объявляют два объекта класса Box —

Box box1 = [[Box alloc]init];     // Create box1 object of type Box
Box box2 = [[Box alloc]init];     // Create box2 object of type Box

Оба объекта box1 и box2 будут иметь свою собственную копию элементов данных.

Доступ к членам данных

К свойствам объектов класса можно получить доступ с помощью оператора прямого доступа к члену (.). Давайте попробуем следующий пример, чтобы прояснить ситуацию:

Live Demo

#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;
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

2013-09-22 21:25:33.314 ClassAndObjects[387:303] Volume of Box1 : 5.000000
2013-09-22 21:25:33.316 ClassAndObjects[387:303] Volume of Box2 : 10.000000

свойства

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

Различные части объявления свойства заключаются в следующем.

  • Свойства начинаются с @property , который является ключевым словом

  • За ним следуют спецификаторы доступа, которые являются неатомарными или атомарными, доступны для чтения или записи и только для чтения, сильные, unsafe_unretained или слабые. Это зависит от типа переменной. Для любого типа указателя мы можем использовать сильный, unsafe_unretained или слабый. Аналогично для других типов мы можем использовать readwrite или readonly.

  • Далее следует тип данных переменной.

  • Наконец, у нас есть имя свойства, оканчивающееся точкой с запятой.

  • Мы можем добавить синтезирующий оператор в классе реализации. Но в последнем XCode, часть синтеза позаботилась о XCode, и вам не нужно включать оператор синтеза.

Свойства начинаются с @property , который является ключевым словом

За ним следуют спецификаторы доступа, которые являются неатомарными или атомарными, доступны для чтения или записи и только для чтения, сильные, unsafe_unretained или слабые. Это зависит от типа переменной. Для любого типа указателя мы можем использовать сильный, unsafe_unretained или слабый. Аналогично для других типов мы можем использовать readwrite или readonly.

Далее следует тип данных переменной.

Наконец, у нас есть имя свойства, оканчивающееся точкой с запятой.

Мы можем добавить синтезирующий оператор в классе реализации. Но в последнем XCode, часть синтеза позаботилась о XCode, и вам не нужно включать оператор синтеза.

Это возможно только со свойствами, которые мы можем получить доступ к переменным экземпляра класса. На самом деле, для свойств создаются методы getter и setter.

Например, предположим, что у нас есть свойство @property (nonatomic, readonly) BOOL isDone . Под капотом находятся сеттеры и геттеры, созданные как показано ниже.