Objective-C динамическое связывание

Динамическое связывание определяет метод, вызываемый во время выполнения, а не во время компиляции. Динамическое связывание также называется поздним связыванием. В Objective-C все методы разрешаются динамически во время выполнения. Точный выполняемый код определяется как именем метода (селектор), так и получающим объектом.

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

В следующем фрагменте кода фактический код, который должен выполняться выражением [anObject printArea], определяется во время выполнения. Система времени выполнения использует селектор для запуска метода, чтобы идентифицировать соответствующий метод в каком бы классе объекта ни оказался.

Давайте посмотрим на простой код, объясняющий динамическое связывание.

#import <Foundation/Foundation.h>

@interface Square:NSObject {
   float area;
}

- (void)calculateAreaOfSide:(CGFloat)side;
- (void)printArea;
@end

@implementation Square
- (void)calculateAreaOfSide:(CGFloat)side {
   area = side * side;
}

- (void)printArea {
   NSLog(@"The area of square is %f",area);
}

@end

@interface Rectangle:NSObject {
   float area;
}

- (void)calculateAreaOfLength:(CGFloat)length andBreadth:(CGFloat)breadth;
- (void)printArea;
@end

@implementation  Rectangle

- (void)calculateAreaOfLength:(CGFloat)length andBreadth:(CGFloat)breadth {
   area = length * breadth;
}

- (void)printArea {
   NSLog(@"The area of Rectangle is %f",area);
}

@end

int main() {
   Square *square = [[Square alloc]init];
   [square calculateAreaOfSide:10.0];
   
   Rectangle *rectangle = [[Rectangle alloc]init];
   [rectangle calculateAreaOfLength:10.0 andBreadth:5.0];
   
   NSArray *shapes = [[NSArray alloc]initWithObjects: square, rectangle,nil];
   id object1 = [shapes objectAtIndex:0];
   [object1 printArea];
   
   id object2 = [shapes objectAtIndex:1];
   [object2 printArea];
   
   return 0;
}

Теперь, когда мы скомпилируем и запустим программу, мы получим следующий результат.

2013-09-28 07:42:29.821 demo[4916] The area of square is 100.000000
2013-09-28 07:42:29.821 demo[4916] The area of Rectangle is 50.000000

Как вы можете видеть в приведенном выше примере, метод printArea динамически выбирается во время выполнения. Это пример динамического связывания, который весьма полезен во многих ситуациях при работе с объектами аналогичного типа.