Динамическое связывание определяет способ вызова во время выполнения, а не во время компиляции. Динамическое связывание также называется поздним связыванием. В Objective-C все методы разрешаются динамически во время выполнения. Точный исполняемый код определяется как именем метода (селектором), так и принимающим объектом.
Динамическое связывание позволяет полиморфизм. Например, рассмотрим коллекцию объектов, включая Rectangle и Square. Каждый объект имеет свою собственную реализацию метода printArea.
В следующем фрагменте кода фактический код, который должен выполняться выражением [anObject printArea], определяется во время выполнения. Система времени выполнения использует селектор для запуска метода, чтобы идентифицировать соответствующий метод в любом классе anObject.
Давайте посмотрим на простой код, который объясняет динамическое связывание.
#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 динамически выбирается во время выполнения. Это пример динамического связывания и весьма полезен во многих ситуациях при работе с объектами подобного типа.