Учебники

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

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

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

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

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

Live Demo

#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 динамически выбирается во время выполнения. Это пример динамического связывания и весьма полезен во многих ситуациях при работе с объектами подобного типа.