iphone - software - programacion orientada a aspectos c#
¿Orientada a aspectos Biblioteca C? (10)
Con Objective-C sugeriría ir con el Patrón de Delegado y Categoría muy usado aquí. Estos pueden ser más útiles que AOP. No intente resolver sus problemas con las soluciones que aprendió en otros idiomas.
¿Existe alguna biblioteca Objective-Orient Orientada a Aspectos que tal vez pueda usar para el desarrollo de iPhone?
Echa un vistazo a este https://github.com/pvantrepote/FlexOC Es una versión alfa y usa (por ahora) la implementación Proxy. También hace inyecciones de dependencia.
Echa un vistazo a mi artículo sobre una posible solución: http://codeshaker.blogspot.com/2012/01/aop-delivered.html
La idea base es hacer un gancho en el mecanismo de envío de mensajes y forzarlo a la ruta de reenvío de mensajes:
Así que una breve explicación sobre cómo funciona:
En el registro de una llamada de método de una clase específica, crea un objeto de envoltura de método (AOPMethod) y almacena toda la información que contiene sobre ese método específico junto con el bloque que se utilizará en la intercepción.
Cambia la implementación del método a _objc_msgForward o _objc_msgForward_stret respectivamente usando method_setImplementation. Este es el punto donde enrutamos el envío de mensajes al mecanismo de reenvío. La próxima vez que se llame al mensaje en la clase base, devolverá la implementación _objc_msgForward como si no hubiera encontrado la implementación. Entonces comienza a resolverlo siguiendo los pasos de reenvío de mensajes. Bonito.
Agregamos el método forwardingTargetForSelector: a la clase base usando class_addMethod para apuntar a nuestra implementación en la clase AOPAspect. También agregamos la implementación del método original y el selector (con un nombre extendido para evitar conflictos entre clases) a nuestra instancia de AOPAspect.
En el método forwardingTargetForSelector: devolvemos nuestra instancia AOPAspect. Con esto, enrutamos el reenvío de mensajes desde el objeto base a nuestro objeto AOPAspect.
Este método forwardingTargetForSelector: será llamado nuevamente en AOPAspect ya que no tenemos ese selector implementado. En este caso devolvemos nil, así que el reenvío de mensajes avanza y verificamos los métodos methodSignatureForSelector: y forwardInvocation: en AOPAspect.
En methodSignatureForSelector: devolvimos la firma de mensaje correcta que ya está almacenada en un diccionario en un objeto envoltorio de método.
En el momento en que llega a nuestra implementación de forwardInvocation: en AOPAspect tenemos una instancia de NSInvocation totalmente configurada y lo único que tenemos que hacer es cambiar el selector a la versión extendida que agregamos a la clase AOPAspect. Aquí podemos ejecutar los bloques registrados para el método dado antes / después o incluso en lugar de la llamada al método. Y, por supuesto, podemos ejecutar el método original llamando a [invocar una invocación].
Para simplificar, solo pasamos el objeto NSInvocation a los bloques registrados para el método, para que puedan acceder a todos los argumentos y al valor de retorno también a través de los métodos getArgument: atIndex: y getReturnValue:.
Y eso es. Funciona con todo tipo de tipos de devolución, tipos de argumento y cualquier variación de argumentos.
Puedes encontrar el ejemplo concreto en el enlace de arriba. Por favor sientete libre de usarlo.
Estoy trabajando en un verdadero AOP-Framework para Objective-C (es más que un método de swizzling). Un alfa será lanzado pronto. Puede escuchar mi presentación alemana sobre la conferencia Macoun''09 aquí: http://www.macoun.de/video2009ts6.php
Si aún está interesado en AOP para Objective-C, puede enviarme un correo electrónico a [email protected] o simplemente visitar este sitio: aspective-c.com/index.html en unas pocas semanas. Habrá una versión en inglés (sí, no traducida por mí ;-)) del sitio y del manual en unas pocas semanas.
Hay un proyecto antiguo llamado AspectCocoa , esto podría ser lo que está buscando.
De lo contrario, te sugeriría que lizas el tuyo. NSProxy
basado en AOP por subclasificación de NSProxy
para un cambio. O podría hacer algún método de swizzling con la función de tiempo de ejecución Obj-C bastante interesante method_exchangeImplementations()
.
Pero a menos que esté buscando un ejercicio divertido, pregúntese qué quiere lograr y si existe una forma de Objective-C que funcione perfectamente.
Hice algunas funciones de proceso previo y posterior de aop rudimentarias en una categoría de NSObject
@implementation NSObject (AOP)
- (void)preprocess:(SEL)sel with:(void (^)(id obj, id param))implementingBlock{
Method m1 = class_getInstanceMethod(self.class, sel);
IMP imp1 = method_getImplementation(m1);
SEL replacement = sel_registerName( [[[NSString stringWithUTF8String:sel_getName(sel)] stringByAppendingString:@"pre"] cStringUsingEncoding:NSUTF8StringEncoding]);
class_addMethod(self.class,replacement, imp1, nil);
method_setImplementation(m1, imp_implementationWithBlock(^(id x, id param){
implementingBlock(x,param);
[x performSelector:replacement withObject:param];
}));
}
- (void)postprocess:(SEL)sel with:(void (^)(id obj, id param))implementingBlock{
Method m1 = class_getInstanceMethod(self.class, sel);
IMP imp1 = method_getImplementation(m1);
SEL replacement = sel_registerName( [[[NSString stringWithUTF8String:sel_getName(sel)] stringByAppendingString:@"post"] cStringUsingEncoding:NSUTF8StringEncoding]);
class_addMethod(self.class,replacement, imp1, nil);
method_setImplementation(m1, imp_implementationWithBlock(^(id x, id param){
[x performSelector:replacement withObject:param];
implementingBlock(x,param);
}));
}
@end
La pregunta es antigua, pero hoy descubrí este proyecto y podría ser útil para alguien en el futuro.
Otro es Aspect Objective-C: https://github.com/tomdalling/AspectObjectiveC
También puede consultar la biblioteca en https://github.com/moszi/AOP-in-Objective-C que es una subclase NSProxy muy simple que le permite interceptar el principio y el final de las llamadas a métodos.
Con esto, incluso puede crear una clase de proxy para sus objetos para asegurarse de que los mensajes enviados a su objeto se serialicen en un solo hilo, independientemente del hilo que invoque.
Todas las personas que aún estén interesadas deben consultar https://github.com/mgebele/MGAOP
Este parece ser un nuevo proyecto con potencial futuro.