Ziel-C-Posing

Bevor Sie anfangen PosingIn Objective-C möchte ich Sie darauf aufmerksam machen, dass das Posieren in Mac OS X 10.5 für veraltet erklärt wurde und danach nicht mehr verwendet werden kann. Wer sich also nicht um diese veralteten Methoden kümmert, kann dieses Kapitel überspringen.

Mit Objective-C kann eine Klasse eine andere Klasse innerhalb eines Programms vollständig ersetzen. Die ersetzende Klasse soll sich als Zielklasse "ausgeben". Bei den Versionen, die das Posieren unterstützen, werden stattdessen alle an die Zielklasse gesendeten Nachrichten von der Posierungsklasse empfangen.

NSObject enthält dieposeAsClass - Methode, mit der wir die vorhandene Klasse wie oben beschrieben ersetzen können.

Einschränkungen beim Posieren

  • Eine Klasse darf sich nur als eine ihrer direkten oder indirekten Oberklassen ausgeben.

  • Die posierende Klasse darf keine neuen Instanzvariablen definieren, die in der Zielklasse fehlen (obwohl sie Methoden definieren oder überschreiben kann).

  • Die Zielklasse hat möglicherweise vor dem Aufstellen keine Nachrichten erhalten.

  • Eine posierende Klasse kann überschriebene Methoden über super aufrufen und so die Implementierung der Zielklasse einbeziehen.

  • Eine posierende Klasse kann in Kategorien definierte Methoden überschreiben.

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

Wenn wir nun das Programm unter einem älteren Mac OS X (V_10.5 oder früher) kompilieren und ausführen, erhalten wir das folgende Ergebnis.

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

Im obigen Beispiel haben wir gerade die ursprüngliche Methode mit unserer Implementierung verschmutzt, und dies wird bei allen NSString-Vorgängen mit der obigen Methode beeinträchtigt.