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

 靖惟嘉彦琼云 发布于 2022-10-29 02:25

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

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

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

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

2 个回答
  • 谢谢你的回答

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

    @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 如下

    2022-10-30 09:09 回答
  • 利用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];
            }));
        });
    
    }
    2022-10-30 09:09 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有