[iOS] 监视某个VC生命周期函数

RT 需求是我要创建一个桥接类。
我需要对一些VC的生命周期做一些监控,比如VC的viewWillAppear等生命周期函数执行完,执行我的方法。

目前已尝试过 协议 hook 但都不够实现我的需求。
协议 并不能强制要求所有这些VC实现这些生命周期方法。毕竟多人开发,如果有人疏漏,桥接功能出错。

hook 第一不够安全,和category重写一样,一个容易有坑,一个是还是无法强制要求这些写VC的人,会实现生命周期这些函数。

所以求助大神们有什么推荐、?

回答:

利用method swizzling,example:

#import "UIViewController+WJAdd.h"

#import <objc/runtime.h>

typedef void (* _IMP)(id,SEL,...);

@implementation UIViewController (WJAdd)

+(void)load

{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

Method viewDidLoad=class_getInstanceMethod(self, @selector(viewDidLoad));

_IMP viewDidLoad_IMP=(_IMP)method_getImplementation(viewDidLoad);

method_setImplementation(viewDidLoad, imp_implementationWithBlock(^(id target,SEL action){

viewDidLoad_IMP(target,@selector(viewDidLoad));

NSLog(@"%@ did load",target);

[target dosomething];

}));

});

}

回答:

谢谢你的回答

但是为什么是替换了多次呢?代码如下

@implementation HookTest

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

}

+(void)load

{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

Method viewDidAppear=class_getInstanceMethod([HookTest class], @selector(viewDidAppear:));

_IMP viewDidAppear_IMP=(_IMP)method_getImplementation(viewDidAppear);

method_setImplementation(viewDidAppear, imp_implementationWithBlock(^(id target,SEL action){

viewDidAppear_IMP(target,@selector(viewDidAppear:));

NSLog(@"%@ did load",target);

// [target dosomething];

}));

});

}

log 如下
图片描述

以上是 [iOS] 监视某个VC生命周期函数 的全部内容, 来源链接: utcz.com/p/186397.html

回到顶部