Posando Objective-C

Antes de começar sobre Posingem Objective-C, gostaria de informar que a pose foi declarada obsoleta no Mac OS X 10.5 e não está disponível para uso posteriormente. Portanto, aqueles que não estão preocupados com esses métodos obsoletos podem pular este capítulo.

Objective-C permite que uma classe substitua completamente outra classe dentro de um programa. Diz-se que a classe substituta "se faz passar por" a classe-alvo. Para as versões que suportam poses, todas as mensagens enviadas para a turma de destino são recebidas pela classe de pose.

NSObject contém o poseAsClass - método que nos permite substituir a classe existente como dito acima.

Restrições em poses

  • Uma classe só pode se passar por uma de suas superclasses diretas ou indiretas.

  • A classe de posicionamento não deve definir nenhuma nova variável de instância que esteja ausente da classe de destino (embora possa definir ou substituir métodos).

  • A classe alvo pode não ter recebido nenhuma mensagem antes da apresentação.

  • Uma classe de apresentação pode chamar métodos substituídos por meio de super, incorporando assim a implementação da classe de destino.

  • Uma classe de poses pode substituir métodos definidos em categorias.

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

Agora, quando compilamos e executamos o programa em um Mac OS X mais antigo (V_10.5 ou anterior), obteremos o seguinte resultado.

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

No exemplo acima, apenas poluímos o método original com nossa implementação e isso será afetado em todas as operações NSString com o método acima.