AOP: Aspect Oriented Programming 面向切面編程git
利用iOS的runtime
,咱們能夠作不少移花接木的事情,讓人首先聯想到的就是Method Swizzle
,對於Method Swizzle
,這裏不展開描述,有興趣的能夠自行深刻了解github
一個使用起來簡單愉快的iOS AOP 庫objective-c
+ (id<AspectToken>)aspect_hookSelector:(SEL)selector
withOptions:(AspectOptions)options
usingBlock:(id)block
error:(NSError **)error;
- (id<AspectToken>)aspect_hookSelector:(SEL)selector
withOptions:(AspectOptions)options
usingBlock:(id)block
error:(NSError **)error;
複製代碼
AspectPositions
編程
typedef NS_OPTIONS(NSUInteger, AspectOptions) {
AspectPositionAfter = 0, // 在原始實現後調用(default)
AspectPositionInstead = 1, // 將替換原始實現
AspectPositionBefore = 2, // 在原始實現以前調用
AspectOptionAutomaticRemoval = 1 << 3 // 執行一次後移除Hook
};
複製代碼
AspectInfo
async
@protocol AspectInfo <NSObject>
- (id)instance;
- (NSInvocation *)originalInvocation;
- (NSArray *)arguments;
@end
複製代碼
/** 統計頁面的訪問量 */
[UIViewController aspect_hookSelector:@selector(viewDidAppear:)
withOptions:AspectPositionAfter
usingBlock:^(id<AspectInfo> aspectInfo){
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *className = NSStringFromClass([[aspectInfo instance] class]);
[self doSomething];
});
} error:NULL];
複製代碼