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.