内容简介:参考:
Aspects
是一个基于Method Swizzle的iOS函数替换的第三方库,他可以很好的实现勾取一个类或者一个对象的某个方法,支持在方法 执行前(AspectPositionBefore)
/ 执行后(AspectPositionAfter)
或 替代原方法执行(AspectPositionInstead)
需要导入的头文件:
#import <Aspects/Aspects.h> 复制代码
对外的两个重要接口声明如下:
第一个:HOOK一个类的所有实例的指定方法
/// 为一个指定的类的某个方法执行前/替换/后,添加一段代码块.对这个类的所有对象都会起作用. /// /// @param block 方法被添加钩子时,Aspectes会拷贝方法的签名信息. /// 第一个参数将会是 `id<AspectInfo>`,余下的参数是此被调用的方法的参数. /// 这些参数是可选的,并将被用于传递给block代码块对应位置的参数. /// 你甚至使用一个没有任何参数或只有一个`id<AspectInfo>`参数的block代码块. /// /// @注意 不支持给静态方法添加钩子. /// @return 返回一个唯一值,用于取消此钩子. + (id<AspectToken>)aspect_hookSelector:(SEL)selector withOptions:(AspectOptions)options usingBlock:(id)block error:(NSError **)error; 复制代码
第二个:HOOK一个类实例的指定方法
/// 为一个指定的对象的某个方法执行前/替换/后,添加一段代码块.只作用于当前对象. - (id<AspectToken>)aspect_hookSelector:(SEL)selector withOptions:(AspectOptions)options usingBlock:(id)block error:(NSError **)error; 复制代码
三个重要** 参数
**如下:
// 1、被HOOK的元类、类或者实例 @property (nonatomic, unsafe_unretained, readonly) id instance; // 2、方法参数列表 @property (nonatomic, strong, readonly) NSArray *arguments; // 3、原来的方法 @property (nonatomic, strong, readonly) NSInvocation *originalInvocation; // 执行原来的方法 [originalInvocation invoke]; 复制代码
基本使用
+(void)Aspect { // 在类UIViewController所有的实例执行viewWillAppear:方法完毕后做一些事情 [UIViewController aspect_hookSelector:@selector(viewWillAppear:) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info) { NSString *className = NSStringFromClass([[info instance] class]); NSLog(@"%@", className); } error:NULL]; // 在实例myVc执行viewWillAppear:方法完毕后做一些事情 UIViewController* myVc = [[UIViewController alloc] init]; [myVc aspect_hookSelector:@selector(viewWillAppear:) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info) { id instance = info.instance; //调用的实例对象 id invocation = info.originalInvocation; //原始的方法 id arguments = info.arguments; //参数 [invocation invoke]; //原始的方法,再次调用 } error:NULL]; // HOOK类方法 Class metalClass = objc_getMetaClass(NSStringFromClass(UIViewController.class).UTF8String); [metalClass aspect_hookSelector:@selector(ClassMethod) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info) { NSLog(@"%@", HOOK类方法); } error:NULL]; } 复制代码
注意:
- 所有的调用,都会是线程安全的。Aspects 使用了Objective-C 的消息转发机会,会有一定的性能消耗。所以对于过于频繁的调用,不建议使用 Aspects.Aspects更适用于视图/控制器相关的等每秒调用不超过1000次的代码.
- 当应用于某个类时(使用类方法添加钩子),不能同时hook父类和子类的同一个方法;否则会引起循环调用问题。但是,当应用于某个类的示例时(使用实例方法添加钩子),不受此限制.
- 使用KVO时,最好在 aspect_hookSelector: 调用之后添加观察者;否则可能会引起崩溃.
参考链接
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Structure and Interpretation of Computer Programs - 2nd Edition
Harold Abelson、Gerald Jay Sussman / The MIT Press / 1996-7-25 / USD 145.56
Structure and Interpretation of Computer Programs has had a dramatic impact on computer science curricula over the past decade. This long-awaited revision contains changes throughout the text. Ther......一起来看看 《Structure and Interpretation of Computer Programs - 2nd Edition 》 这本书的介绍吧!