Objective-C的hook方案/ Method Swizzling

简介: Method Swizzling是改变一个selector的实际实现的技术。

Method Swizzling


Method Swizzling是改变一个selector的实际实现的技术。通过这一技术,我们可以在运行时通过修改类的分发表中selector对应的函数,来修改方法的实现。

实现


以关闭推送为例 通过swizzleSelector,替换UIApplication的【registerForRemoteNotifications】方法,让它没法实现,实现整体关闭推送信息功能


static inline void JJ_swizzleSelector(Class class, SEL originalSelector, SEL swizzledSelector) {
    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
    if (class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))) {
        class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}
@implementation UIApplication (Hook)
+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];
        JJ_swizzleSelector(class, @selector(registerForRemoteNotifications), @selector(hook_registerForRemoteNotifications));
    });
}
-(void)hook_registerForRemoteNotifications
{
    //关闭通知
}
@end


目录
相关文章
|
PyTorch 算法框架/工具
torch中报错:AttributeError: 'builtin_function_or_method' object has no attribute 'detach'怎么解决?
这个错误信息 "AttributeError: 'builtin_function_or_method' object has no attribute 'detach'" 表示你尝试在一个内置函数或方法对象上调用 detach() 方法,而这种对象没有这个属性。 detach() 是 PyTorch 张量和变量的方法,允许它们从计算图中分离出来,因此不能在其他类型的对象上调用。要解决这个错误,请确保你正在一个 PyTorch 张量或变量上调用 detach() 方法。
1099 0
【UVM源码学习】uvm_object_globals
【UVM源码学习】uvm_object_globals
145 0
【UVM源码学习】uvm_object_globals
【UVM源码学习】uvm_object
【UVM源码学习】uvm_object
137 0
【UVM源码学习】uvm_object
【UVM源码学习】uvm_event
【UVM源码学习】uvm_event
330 0
【UVM源码学习】uvm_event
|
测试技术
【UVM源码学习】uvm_globals
【UVM源码学习】uvm_globals
653 0
|
C# iOS开发 Java
****Objective-C 中的方法的调用
oc语言中采用特定的语言调用类或者实例(对象)的方法称为发送消息或者方法调用。 oc中方法的调用有两种:  第一种: [类名或对象名 方法名];   [ClassOrInstance method]; [ClassOrInstance method:arg1]; ...
1141 0
|
安全 iOS开发
Method Swizzling
Method Swizzling
206 0
Method Swizzling
|
iOS开发
iOS - Runtime Method Swizzling(上)
Runtime合集 iOS - Runtime基础
iOS - Runtime Method Swizzling(上)
|
监控 iOS开发
iOS - Runtime Method Swizzling(下)
Runtime合集 iOS - Runtime基础
|
iOS开发
iOS - Runtime Method Swizzling(中)
Runtime合集 iOS - Runtime基础