Аспектно-ориентированная библиотека Objective-C? - PullRequest
23 голосов
/ 02 октября 2009

Существует ли какая-либо библиотека Aspect-Oriented Objective-C, которую я мог бы использовать для разработки для iPhone?

Ответы [ 10 ]

8 голосов
/ 03 октября 2009

Существует старый проект под названием AspectCocoa , это может быть то, что вы ищете.

В противном случае Í предложил бы свернуть свое собственное. Либо AOP на основе прокси путем подкласса NSProxy для изменения. Или вы можете сделать какой-нибудь метод с использованием довольно крутой функции времени выполнения Obj-C method_exchangeImplementations().

Но если вы не ищете веселое упражнение, спросите себя, чего вы хотите достичь, и существует ли уже существующий способ работы Objective-C.

6 голосов
/ 23 января 2012

Ознакомьтесь с моей статьей о возможном решении: http://codeshaker.blogspot.com/2012/01/aop-delivered.html

Основная идея состоит в том, чтобы подключить механизм отправки сообщений и принудительно установить его на маршруте пересылки сообщений:

Итак, краткое объяснение о том, как это работает:

  1. При регистрации вызова метода определенного класса он создает объект-обертку метода (AOPMethod) и сохраняет в нем каждую информацию. об этом конкретном методе вместе с блоком, который будет использоваться при перехват.

  2. Изменяет реализацию метода на _objc_msgForward или _objc_msgForward_stret соответственно с использованием method_setImplementation. Это та точка, куда мы направляем отправку сообщений на пересылку механизм. В следующий раз, когда сообщение вызывается в базовом классе, оно вернет реализацию _objc_msgForward, как если бы она не нашла реализация. Таким образом, он начинает решать, пройдя через шаги пересылки сообщений. Ницца.

  3. Мы добавляем forwardingTargetForSelector: метод к базовому классу, используя class_addMethod, чтобы указать на нашу реализацию в AOPAspect учебный класс. Также добавляем оригинальную реализацию метода и селектор (с расширенным именем для предотвращения конфликтов между классами) Экземпляр AOPAspect.

  4. В методе forwardingTargetForSelector: мы возвращаем наш экземпляр AOPAspect. С этим мы направляем пересылку сообщений от базовый объект для нашего объекта AOPAspect.

  5. Этот forwardingTargetForSelector: метод будет вызван снова в AOPAspect, поскольку у нас не реализован этот селектор. Этот случай мы верните ноль, так что переадресация сообщений продвигается дальше и проверит наличие methodSignatureForSelector: и forwardInvocation: методы на AOPAspect.

  6. В methodSignatureForSelector: мы вернули правильную подпись сообщения, которая уже сохранена в словаре в оболочке метода объект.

  7. В то время, когда оно приходит к нашей реализации forwardInvocation: в AOPAspect у нас есть полностью настроенный экземпляр NSInvocation и Единственное, что нам нужно сделать, это изменить селектор на расширенный версия, которую мы добавили в класс AOPAspect. Здесь мы можем запустить блоки зарегистрирован для данного метода до / после или даже вместо вызов метода. И, конечно, мы можем запустить оригинальный метод, вызвав [вызов вызова].

  8. Для простоты мы просто передаем объект NSInvocation в блоки, зарегистрированные для метода, чтобы они могли получить доступ ко всем аргументам и также возвращаем значение через getArgument: atIndex: и getReturnValue: методы.

И это все. Работает со всеми типами возвращаемых значений, типами аргументов и любая вариация аргументов.

Конкретный пример вы можете найти по ссылке выше. Пожалуйста, не стесняйтесь использовать его.

4 голосов
/ 06 мая 2014

Вопрос старый, но я обнаружил этот проект сегодня, и он может пригодиться кому-то в будущем.

https://github.com/steipete/Aspects

2 голосов
/ 09 января 2011

Также вы можете проверить библиотеку на https://github.com/moszi/AOP-in-Objective-C, которая является очень простым подклассом NSProxy, позволяющим вам перехватывать начало и конец вызовов метода.

При этом вы даже можете создать прокси-класс для своих объектов, чтобы убедиться, что сообщения, отправляемые на ваш объект, сериализуются в одном потоке, независимо от вызывающего потока.

1 голос
/ 30 мая 2012

Проверьте это https://github.com/pvantrepote/FlexOC Это альфа-версия и использует (на данный момент) реализацию Proxy. Это также делает инъекции зависимости.

1 голос
/ 14 мая 2011

Все еще заинтересованные люди должны взглянуть на https://github.com/mgebele/MGAOP

Это новый проект с будущим потенциалом.

0 голосов
/ 14 ноября 2012

Я сделал несколько элементарных функций до и после обработки для категории 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
0 голосов
/ 23 января 2012

С Objective-C я бы предложил использовать здесь очень часто используемый шаблон категорий и делегатов. Они могут быть более полезными, чем АОП. Не пытайтесь решить свои проблемы с помощью решений, которые вы узнали для других языков.

0 голосов
/ 10 сентября 2011

Еще один аспект аспект-C: https://github.com/tomdalling/AspectObjectiveC

0 голосов
/ 25 марта 2011

Я работаю над настоящим (это больше, чем просто метод) AOP-Framework для Objective-C. Альфа скоро выйдет. Вы можете прослушать мою немецкую презентацию на конференции Macoun'09 здесь: http://www.macoun.de/video2009ts6.php

Если вы все еще заинтересованы в AOP для Objective-C, вы можете отправить мне письмо на negm-awad@cocoading.de или просто посетить этот сайт: aspective-c.com / index.html За несколько недель. Через несколько недель будет выпущена английская версия (да, я не переведен ;-)) сайта и руководство.

...