Objective-C Dynamic Binding

L'associazione dinamica determina il metodo da richiamare in fase di esecuzione anziché in fase di compilazione. L'associazione dinamica viene anche definita associazione tardiva. In Objective-C, tutti i metodi vengono risolti dinamicamente in fase di esecuzione. Il codice esatto eseguito è determinato sia dal nome del metodo (il selettore) che dall'oggetto ricevente.

Il legame dinamico consente il polimorfismo. Ad esempio, si consideri una raccolta di oggetti tra cui Rectangle e Square. Ogni oggetto ha la propria implementazione di un metodo printArea.

Nel seguente frammento di codice, il codice effettivo che dovrebbe essere eseguito dall'espressione [anObject printArea] è determinato in fase di esecuzione. Il sistema runtime utilizza il selettore per il metodo eseguito per identificare il metodo appropriato in qualunque classe di unObject risulta essere.

Esaminiamo un semplice codice che spieghi l'associazione dinamica.

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

Ora, quando compiliamo ed eseguiamo il programma, otterremo il seguente risultato.

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

Come puoi vedere nell'esempio sopra, il metodo printArea viene selezionato dinamicamente in runtime. È un esempio di associazione dinamica ed è abbastanza utile in molte situazioni quando si ha a che fare con oggetti di tipo simile.