una software programming programacion poo poa paradigma oriented orientado orientada ejemplos diagrama desarrollo caracteristicas biblioteca aspectos actividades iphone objective-c ios aop

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 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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. En methodSignatureForSelector: devolvimos la firma de mensaje correcta que ya está almacenada en un diccionario en un objeto envoltorio de método.

  7. 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].

  8. 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




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.