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.