方法调配(method swizzling)

http://www.cocoachina.com/ios/20141002/9819.html

http://blog.sina.com.cn/s/blog_a343f32b0101en4o.html

OC 是一门及其动态的语言,在运行期间,可以动态给某个对象添加方法,并且还可以改变某个方法实现

我们可以用此特性来干点坏事

通过这个特性,我们可以不需要继承子类,就可以改变这个类本身的一些功能,经常需要统计每个页面浏览的次数

这时我们一般是基于基类baseViewController 在viewWillAppear里统计,但这需要控制器都要继承它

我们可以直接用该技术,来拦截ViewWillAppear方法,在此方法里面去添加统计功能,但此项技术一般只是在调试的时候用

 1 #import "UIViewController+Swizzle.h"
 2 #import <objc/runtime.h>
 3 @implementation UIViewController (Swizzle)
 4 + (void)load{
 5     [super load];
 6     static dispatch_once_t onceToken;
 7     dispatch_once(&onceToken, ^{
 8         SEL old = @selector(viewWillAppear:);
 9         SEL newSelecotr  = @selector(xxx_viewWillAppear:);
10         Method oldm = class_getInstanceMethod([UIViewController class], old);
11         Method newm = class_getInstanceMethod([UIViewController class], newSelecotr);
12         BOOL didAddMethod  = class_addMethod([UIViewController class], old, method_getImplementation(newm ), method_getTypeEncoding(newm));
13         if (didAddMethod) {
14             class_replaceMethod([UIViewController class], newSelecotr, method_getImplementation(oldm), method_getTypeEncoding(oldm));
15         }else{
16             method_exchangeImplementations(oldm, newm);
17         }
18     });
19 }
20
21 - (void)xxx_viewWillAppear:(BOOL)animated{
22     [self xxx_viewWillAppear:animated];
23     NSLog(@"do things");
24 }
时间: 2024-08-07 17:01:20

方法调配(method swizzling)的相关文章

iOS黑魔法-Method Swizzling

公司年底要在新年前发一个版本,最近一直很忙,好久没有更新博客了.正好现在新版本开发的差不多了,抽空总结一下.由于最近开发新版本,就避免不了在开发和调试过程中引起崩溃,以及诱发一些之前的bug导致的崩溃.而且项目比较大也很不好排查,正好想起之前研究过的Method Swizzling,考虑是否能用这个苹果的“黑魔法”解决问题,当然用好这个黑魔法并不局限于解决这些问题...... 需求 就拿我们公司项目来说吧,我们公司是做导航的,而且项目规模比较大,各个控制器功能都已经实现.突然有一天老大过来,说我

iOS runtime探究(四): 从runtiem开始实践Category添加属性与黑魔法method swizzling

你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639335 本文主要讲解runtime相关知识,从原理到实践,由于包含内容过多分为以下五篇文章详细讲解,可自行选择需要了解的方向: 从runtime开始: 理解面向对象的类到面向过程的结构体 从runtime开始: 深入理解OC消息转发机制 从runtime开始: 理解OC的属性property 从runtime开始: 实践Category添加属

初探Method Swizzling

Method Swizzling: 即方法交换. 先来学点Objective-C的运行时来热热身. 一.在Objective-C中,message与方法的真正实现是在执行阶段绑定的,而非编译阶段.编译器会将消息发送转换成对objc_msgSend方法的调用. objc_msgSend方法含两个必要参数:receiver.方法名(即:selector),如: [receiver message]; 将被转换为:objc_msgSend(receiver, selector); objc_msgSe

ios逆向工程-内部钩子(Method Swizzling)

Method Swizzling(方法调配) 怎么说呢,先了解什么是钩子为什么用钩子,学过C++的朋友应该清楚,hook就是用来获得(截断/改变)底层调用的方法.这样我们可以自由的修改或者读取一些想要的东西.(个人理解) 下面是百度百科的解释:钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之前处理它.钩子机制允许应用程序截获处理window消息或特定事件 那io

理解Objective-C Runtime(四)Method Swizzling

Objective-C对象收到消息之后,究竟会调用何种方法需要在运行期间才能解析出来.那你也许会问:与给定的选择子名称相应的方法是不是也可以在runtime改变呢?没错,就是这样.若能善用此特性,则可发挥出巨大优势,因为我们既不需要源代码,也不需要通过继承子类来覆写方法就能改变这个类本身的功能.这样一来,新功能将在本类的所有实例中生效,而不仅限于覆写了相关方法的那些子类实例.此方案就是大名鼎鼎的「method swizzling」,中文常称之为『方法调配』或『方法调和』或『方法混合』. Meth

IOS之方法混写(swizzling.)

OC中的混写(swizzling)是指透明地把一个方法换成另外一个.简明的说就是在运行时替换方法.利用方法混写可以改变那些没有源代码的对象(包括系统对象)的行为. 方法混写的代码看起来相对比较直观的,举个例子说明一下,之前做本地化翻译的时候就有用到 swizzling 方法.直接去swizze方法 awakeFromNib 然后替换成自己的方法实现以实现本地化翻译.详细可以看这篇文章:IOS本地化应用程序. 主要用到的代码也就这两句: +(void)load { // Autoload : sw

Objective-C Runtime 运行时之四:Method Swizzling

理解Method Swizzling是学习runtime机制的一个很好的机会.在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文. Method Swizzling是改变一个selector的实际实现的技术.通过这一技术,我们可以在运行时通过修改类的分发表中selector对应的函数,来修改方法的实现. 例如,我们想跟踪在程序中每一个view controller展示给用户的次数:当然,我们可以在每个view controller的

iOS 使用Method Swizzling隐藏Status Bar

在iOS 6中,隐藏Status Bar非常的简单. // iOS 6及以前,隐藏状态栏 [[UIApplication sharedApplication] setStatusBarHidden:YES]; 来到了iOS 7的年代以后,需要在UIViewController中指定: #ifdef __IPHONE_7_0 - (BOOL)prefersStatusBarHidden { return YES; } #endif 并通过下列代码刷新状态栏: if ([viewController

iOS Method Swizzling和分类的妙用AppDelegate轻量化处理

http://www.cocoachina.com/ios/20151117/14167.html 简介 在iOS工程中,AppDelegate往往会有上千行,甚至几千行,这样就会给维护AppDelegate带来诸多麻烦.比方说,老板想在出现HomeViewController之前弹出广告并停顿几秒,这样你就要加入插入广告的逻辑:又比方说,老板想在开始做个请求,判断某个开关是否打开.这样就会在AppDelegate中插入很多相关的不相关的代码. 在AppDelegate中,- (BOOL)app