0x00 崩溃重现

Hook 的类,是这样的:

@interface ViewController : UIViewController
@end

@implementation ViewController
- (void)loadView {
    [super loadView];
    
    NSLog(@"%s", __func__);
}

- (void)test {
    NSLog(@"%s", __func__);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self test];
}

@end

写的 Hook 逻辑是这样的:

@interface Hook : NSObject
@end

#import <objc/runtime.h>
@implementation Hook

+ (void)load {
    NSLog(@"%s", __func__);
    
    Class class = NSClassFromString(@"ViewController");
    Method originalMethod = class_getInstanceMethod(class, NSSelectorFromString(@"loadView"));
    Method swizzledMethod = class_getInstanceMethod([self class], NSSelectorFromString(@"swizzled_loadView"));
    
    method_exchangeImplementations(originalMethod, swizzledMethod);
}

- (void)swizzled_loadView {
    NSLog(@"%s", __func__);

    [self swizzled_loadView];
}

@end

真机运行后,是这样的,直接崩溃:

+[Hook load]
-[Hook swizzled_loadView]
-[ViewController swizzled_loadView]: unrecognized selector sent to instance 0x102e08dd0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ViewController swizzled_loadView]: unrecognized selector sent to instance 0x102e08dd0'

0x00 换个方式

写的 Hook 逻辑是这样的:

@interface UIViewController (Hook)
@end

#import <objc/runtime.h>
@implementation UIViewController (Hook)

+ (void)load {
    NSLog(@"%s", __func__);
    
    Class class = NSClassFromString(@"ViewController");
    Method originalMethod = class_getInstanceMethod(class, NSSelectorFromString(@"loadView"));
    Method swizzledMethod = class_getInstanceMethod([self class], NSSelectorFromString(@"swizzled_loadView"));

    method_exchangeImplementations(originalMethod, swizzledMethod);
}

- (void)swizzled_loadView {
    NSLog(@"%s", __func__);

    [self swizzled_loadView];
    
    UIView *view = [[UIView alloc] init];
    view. frame = CGRectMake (100, 200, 200, 200);
    view.backgroundColor = [UIColor redColor];
    [self.view addSubview:view];
}

@end

真机运行后,不崩溃了:

+[UIViewController(Hook) load]
-[UIViewController(Hook) swizzled_loadView]
-[ViewController loadView]
-[ViewController test]

并且成功,添加了 view


点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部