您的位置:首页 > 科技 > 能源 > 哪里可以接外包客服_在线客服管理系统_黄页引流推广链接_seo优化是啥

哪里可以接外包客服_在线客服管理系统_黄页引流推广链接_seo优化是啥

2025/2/25 1:43:03 来源:https://blog.csdn.net/peng_up/article/details/145570564  浏览:    关键词:哪里可以接外包客服_在线客服管理系统_黄页引流推广链接_seo优化是啥
哪里可以接外包客服_在线客服管理系统_黄页引流推广链接_seo优化是啥

方法交换可以放在 +load+initialize 方法中,也可以自己根据时机来空,比如开启某个开关后才需要交换方法。如果是在+load中调用,交换工作会在类加载时(程序启动)自动调用;如果是在+initialize中调用,则会在该类初次发送消息的时候调用(如初始化、调用类方法等)。我们可以根据实际需要决定调用调用时机

实现交换

#import <objc/runtime.h>@implementation UIViewController (Swizzling)+ (void)load {// 获取原始的方法Method originalMethod = class_getInstanceMethod(self, @selector(viewWillAppear:));// 获取要交换的自定义实现方法Method swizzledMethod = class_getInstanceMethod(self, @selector(xxx_viewWillAppear:));// 交换方法BOOL didAddMethod = class_addMethod(self, @selector(viewWillAppear:), method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));if (didAddMethod) {// 如果方法添加成功,说明原来类没有实现 viewWillAppear,直接使用交换后的方法class_replaceMethod(self, @selector(xxx_viewWillAppear:), method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));} else {// 如果原有的方法已经实现,则交换两个方法的实现method_exchangeImplementations(originalMethod, swizzledMethod);}
}- (void)xxx_viewWillAppear:(BOOL)animated {// 在这里可以调用自己的实现[self xxx_viewWillAppear:animated]; // 注意:这里调用的是交换后的实现// 自定义代码,或者添加日志、调试等NSLog(@"viewWillAppear 被交换了!");
}@end

关键点

  • class_getInstanceMethod:用来获取类的实例方法。
  • method_exchangeImplementations:用来交换两个方法的实现。
  • class_addMethod:如果目标方法不存在,可以添加一个新的方法。
  • method_getImplementationmethod_getTypeEncoding:分别获取方法的实现和类型编码。

注意事项

  • 递归调用:在 xxx_viewWillAppear: 方法内部,我们使用了 self xxx_viewWillAppear:animated; 来避免递归调用自身。因为方法已经交换,这行代码会触发原始的 viewWillAppear: 方法调用。
  • 调用顺序:交换方法的顺序是非常重要的。在我们的例子中,我们在自定义方法中先执行了交换后的实现 (xxx_viewWillAppear:),然后再执行原始的 viewWillAppear:。这样可以确保自定义的行为不会丢失。

实际应用

此类应用比较多的就是数据统计,比如统计页面浏览、元素点击,通过方法交换植入监控程序,大大提高开发效率。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com