Enlace dinámico de Objective-C

El enlace dinámico determina el método a invocar en tiempo de ejecución en lugar de en tiempo de compilación. El enlace dinámico también se conoce como enlace tardío. En Objective-C, todos los métodos se resuelven dinámicamente en tiempo de ejecución. El código exacto ejecutado está determinado por el nombre del método (el selector) y el objeto receptor.

La unión dinámica permite el polimorfismo. Por ejemplo, considere una colección de objetos que incluyen Rectangle y Square. Cada objeto tiene su propia implementación de un método printArea.

En el siguiente fragmento de código, el código real que debe ejecutar la expresión [anObject printArea] se determina en tiempo de ejecución. El sistema de tiempo de ejecución usa el selector para la ejecución del método para identificar el método apropiado en cualquier clase de un objeto que resulte ser.

Veamos un código simple que explicaría el enlace dinámico.

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

Ahora, cuando compilemos y ejecutemos el programa, obtendremos el siguiente resultado.

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

Como puede ver en el ejemplo anterior, el método printArea se selecciona dinámicamente en tiempo de ejecución. Es un ejemplo de enlace dinámico y es bastante útil en muchas situaciones cuando se trata de objetos similares.