内容简介:参考:
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: 调用之后添加观察者;否则可能会引起崩溃.
参考链接
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Beginning ASP.NET 4 in C# and Vb
Imar Spaanjaars / Wrox / 2010-3-19 / GBP 29.99
This book is for anyone who wants to learn how to build rich and interactive web sites that run on the Microsoft platform. With the knowledge you gain from this book, you create a great foundation to ......一起来看看 《Beginning ASP.NET 4 in C# and Vb》 这本书的介绍吧!