面试题答案
一键面试AOP编程概念
AOP(Aspect - Oriented Programming,面向切面编程)是一种编程范式,旨在将横切关注点(如日志记录、性能监控、权限控制等)从业务逻辑中分离出来。通过这种方式,使得这些横切关注点可以被模块化、复用,并且不影响业务逻辑的核心代码,提高代码的可维护性和可扩展性。
使用Category实现AOP切面技术
具体步骤
- 创建Category:为需要添加横切逻辑的类创建Category。例如,对于
ViewController
类,如果要添加日志记录功能,可以创建ViewController+Logging
的Category。
@interface ViewController (Logging)
@end
- 实现横切逻辑:在Category的
@implementation
中实现横切逻辑。比如在viewDidLoad
方法调用前后添加日志记录。
#import "ViewController+Logging.h"
#import <objc/runtime.h>
@implementation ViewController (Logging)
+ (void)load {
Method originalMethod = class_getInstanceMethod(self, @selector(viewDidLoad));
Method swizzledMethod = class_getInstanceMethod(self, @selector(swizzled_viewDidLoad));
method_exchangeImplementations(originalMethod, swizzledMethod);
}
- (void)swizzled_viewDidLoad {
NSLog(@"Before viewDidLoad");
[self swizzled_viewDidLoad];
NSLog(@"After viewDidLoad");
}
@end
这里通过method_exchangeImplementations
函数交换了viewDidLoad
方法和自定义的swizzled_viewDidLoad
方法的实现,从而在原方法执行前后添加了日志记录。
优缺点
- 优点:
- 简单易用:不需要复杂的框架,通过Category就能实现。
- 低侵入性:不修改原有类的代码,在Category中实现横切逻辑,对原有业务逻辑影响小。
- 灵活性高:可以根据需要为不同的类创建不同的Category来添加各种横切逻辑。
- 缺点:
- 命名冲突风险:Category中的方法名如果不小心与原类或其他Category中的方法名冲突,会导致难以排查的错误。
- 难以调试:由于方法交换的机制,在调试时可能会使调用栈变得复杂,增加调试难度。
- 生命周期问题:Category的加载和方法交换时机如果处理不当,可能会出现意外情况。例如,加载顺序可能影响方法交换的正确性。