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