ОБНОВЛЕНИЕ:
Обратившись к Джорджу с некоторыми ключевыми предложениями, я придумал два разных способа добиться именно того, чего я хочу, в CodeRunner, и разместил их на основном сайте Github: Objective-C AOP gist
Код грубый, потому что это новая концепция, а я закончил только в 1:30. Это определенно работает и имеет некоторые тонкости, такие как автоматическое добавление всех методов, которые не являются инициализаторами, геттерами или сеттерами. [КОНЕЦ ОБНОВЛЕНИЯ]
Несколько раз (но, конечно, не очень часто) я сталкивался с ситуацией, когда мой код был бы немного DRYer, если бы я мог вызывать контекстно-зависимый фрагмент кода для каждого метода в классе. Использование среды выполнения Objective-C совершенно нормально, я бы также принял решения C или C++.
Вместо:
- (void)methodName1
{
self->selector = _cmd;
NSLog(@"This method is named: %@",_cmd);
//more code
}
- (void)methodName2
{
self->selector = _cmd;
NSLog(@"This method is named: %@",_cmd);
//more code
}
Сделайте что-то вроде этого, с тем же результатом:
+ (void)AOPMethod
{
self->selector = _cmd;
NSLog(@"This method is named: %@",_cmd);
}
- (void)methodName1
{
//more code
}
- (void)methodName2
{
//more code
}
В реальном приложении AOPMethod будет содержать больше кода и в классе будет больше методов.
P.S. Я довольно одержим DRY. Наряду с ясностью изложения и производительностью это ключевой компонент того, как я оцениваю качество своего кода в долгосрочной перспективе. Для каждого нового способа, которым я могу избежать повторения, выгода экспоненциальна, потому что я прерываю как можно больше кода в повторно используемых классах, которые используются во многих проектах.
NSInvocations, но для вызоваforwardInvocation:вам нужно удалить исходные методы (больше невозможно в ObjC 2). Я думаю, чтоNSProxyстэндины — это лучшая вещь, не прибегающая к хакам. - person Georg Fritzsche   schedule 15.02.2012