Objectif-C Posant

Avant de commencer Posingen Objective-C, je voudrais vous signaler que la pose a été déclarée obsolète dans Mac OS X 10.5 et qu'elle n'est plus disponible pour une utilisation par la suite. Donc, ceux qui ne sont pas concernés par ces méthodes obsolètes peuvent sauter ce chapitre.

Objective-C permet à une classe de remplacer entièrement une autre classe dans un programme. On dit que la classe remplaçante se "pose comme" la classe cible. Pour les versions prenant en charge la pose, tous les messages envoyés à la classe cible sont à la place reçus par la classe posant.

NSObject contient la méthode poseAsClass qui nous permet de remplacer la classe existante comme indiqué ci-dessus.

Restrictions à la pose

  • Une classe ne peut se poser que comme l'une de ses superclasses directes ou indirectes.

  • La classe posant ne doit définir aucune nouvelle variable d'instance absente de la classe cible (bien qu'elle puisse définir ou remplacer des méthodes).

  • La classe cible n'a peut-être reçu aucun message avant la pose.

  • Une classe posant peut appeler des méthodes surchargées via super, incorporant ainsi l'implémentation de la classe cible.

  • Une classe posant peut remplacer les méthodes définies dans les catégories.

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

Maintenant, lorsque nous compilons et exécutons le programme dans un ancien Mac OS X (V_10.5 ou antérieur), nous obtiendrons le résultat suivant.

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

Dans l'exemple ci-dessus, nous venons de polluer la méthode d'origine avec notre implémentation et cela sera affecté tout au long de toutes les opérations NSString avec la méthode ci-dessus.