Vinculação Dinâmica Objective-C

A vinculação dinâmica está determinando o método a ser invocado no tempo de execução, em vez de no tempo de compilação. A vinculação dinâmica também é conhecida como vinculação tardia. Em Objective-C, todos os métodos são resolvidos dinamicamente no tempo de execução. O código exato executado é determinado pelo nome do método (o seletor) e pelo objeto receptor.

A ligação dinâmica permite o polimorfismo. Por exemplo, considere uma coleção de objetos incluindo Retângulo e Quadrado. Cada objeto tem sua própria implementação de um método printArea.

No fragmento de código a seguir, o código real que deve ser executado pela expressão [anObject printArea] é determinado em tempo de execução. O sistema de tempo de execução usa o seletor para o método executado para identificar o método apropriado em qualquer classe de anObject que venha a ser.

Vejamos um código simples que explicaria a vinculação dinâmica.

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

Agora, quando compilarmos e executarmos o programa, obteremos o seguinte 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 você pode ver no exemplo acima, o método printArea é selecionado dinamicamente no tempo de execução. É um exemplo de vinculação dinâmica e é bastante útil em muitas situações ao lidar com tipos de objetos semelhantes.