Obiettivo C in posa

Prima di iniziare Posingin Objective-C, vorrei portare alla tua attenzione che la posa è stata dichiarata deprecata in Mac OS X 10.5 e non è disponibile per l'uso da allora in poi. Quindi, coloro che non sono preoccupati per questi metodi deprecati possono saltare questo capitolo.

Objective-C consente a una classe di sostituire completamente un'altra classe all'interno di un programma. Si dice che la classe sostitutiva "si atteggi a" classe bersaglio. Per le versioni che supportano la posa, tutti i messaggi inviati alla classe di destinazione vengono invece ricevuti dalla classe di posa.

NSObject contiene il metodo poseAsClass che ci consente di sostituire la classe esistente come detto sopra.

Restrizioni nella posa

  • Una classe può presentarsi solo come una delle sue superclassi dirette o indirette.

  • La classe in posa non deve definire nuove variabili di istanza assenti dalla classe di destinazione (sebbene possa definire o sostituire i metodi).

  • La classe target potrebbe non aver ricevuto alcun messaggio prima della posa.

  • Una classe in posa può chiamare metodi sostituiti tramite super, incorporando così l'implementazione della classe di destinazione.

  • Una classe in posa può sovrascrivere i metodi definiti nelle categorie.

#import <Foundation/Foundation.h>

@interface MyString : NSString

@end

@implementation MyString

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target
withString:(NSString *)replacement {
   NSLog(@"The Target string is %@",target);
   NSLog(@"The Replacement string is %@",replacement);
}

@end

int main() {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   [MyString poseAsClass:[NSString class]];
   NSString *string = @"Test";
   [string stringByReplacingOccurrencesOfString:@"a" withString:@"c"];
   
   [pool drain];
   return 0;
}

Ora, quando compiliamo ed eseguiamo il programma in un vecchio Mac OS X (V_10.5 o precedente), otterremo il seguente risultato.

2013-09-22 21:23:46.829 Posing[372:303] The Target string is a
2013-09-22 21:23:46.830 Posing[372:303] The Replacement string is c

Nell'esempio precedente, abbiamo appena contaminato il metodo originale con la nostra implementazione e questo verrà influenzato durante tutte le operazioni di NSString con il metodo precedente.