Poses de Objective-C
Antes de empezar Posingen Objective-C, me gustaría advertirle que la pose fue declarada obsoleta en Mac OS X 10.5 y no está disponible para su uso posterior. Entonces, para aquellos que no estén preocupados por estos métodos obsoletos, pueden omitir este capítulo.
Objective-C permite que una clase reemplace completamente a otra clase dentro de un programa. Se dice que la clase que reemplaza "se hace pasar por" la clase objetivo. Para las versiones que admitían la presentación, todos los mensajes enviados a la clase de destino son recibidos por la clase de presentación.
NSObject contiene el método poseAsClass - que nos permite reemplazar la clase existente como se dijo anteriormente.
Restricciones para posar
Una clase solo puede hacerse pasar por una de sus superclases directas o indirectas.
La clase de presentación no debe definir ninguna variable de instancia nueva que esté ausente de la clase de destino (aunque puede definir o anular métodos).
Es posible que la clase objetivo no haya recibido ningún mensaje antes de la presentación.
Una clase de presentación puede llamar a métodos anulados a través de super, incorporando así la implementación de la clase de destino.
Una clase de poses puede anular los métodos definidos en categorías.
#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;
}
Ahora, cuando compilemos y ejecutemos el programa en un Mac OS X anterior (V_10.5 o anterior), obtendremos el siguiente 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
En el ejemplo anterior, simplemente contaminamos el método original con nuestra implementación y esto se verá afectado en todas las operaciones de NSString con el método anterior.