面向切面编程:iOS

栏目: IOS · 发布时间: 6年前

内容简介:参考:

参考: 面向切面编程:React Native

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: 调用之后添加观察者;否则可能会引起崩溃.

参考链接

iOS---防止UIButton重复点击的三种实现方式

Aspects– iOS的AOP面向切面编程的库

Objc 黑科技 - Method Swizzle 的一些注意事项

Aspects– iOS的AOP面向切面编程的库


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

这就是搜索引擎

这就是搜索引擎

张俊林 / 电子工业出版社 / 2012-1-1 / 45.00元

搜索引擎作为互联网发展中至关重要的一种应用,已经成为互联网各个领域的制高点,其重要性不言而喻。搜索引擎领域也是互联网应用中不多见的以核心技术作为其命脉的领域,搜索引擎各个子系统是如何设计的?这成为广大技术人员和搜索引擎优化人员密切关注的内容。 本书的最大特点是内容新颖全面而又通俗易懂。对于实际搜索引擎所涉及的各种核心技术都有全面细致的介绍,除了作为搜索系统核心的网络爬虫、索引系统、排序系统、......一起来看看 《这就是搜索引擎》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具