Method Swizzling

转载 2015年11月21日 10:59:55

swizzle英文解释为:(用酒棒等)搅合;那么Method Swizzling可以翻译为”方法交换”

方法由两个部分组成。Selector相当于一个方法的id;IMP是方法的实现。这样分开的一个便利之处是selector和IMP之间的对应关系可以被改变。比如一个 IMP 可以有多个 selectors 指向它。

而 Method Swizzling 可以交换两个方法的实现。或许你会问“什么情况下会需要这个呢?”。我们先来看下Objective-C中,两种扩展class的途径。首先是 subclassing。你可以重写某个方法,调用父类的实现,这也意味着你必须使用这个subclass的实例,但如果继承了某个Cocoa class,而Cocoa又返回了原先的class(比如 NSArray)。这种情况下,你会想添加一个方法到NSArray,也就是使用Category。99%的情况下这是OK的,但如果你重写了某个方法,就没有机会再调用原先的实现了。

Method Swizzling 可以搞定这个问题。你可以重写某个方法而不用继承,同时还可以调用原先的实现。通常的做法是在category中添加一个方法(当然也可以是一个全新的class)。可以通过method_exchangeImplementations这个运行时方法来交换实现。来看一个demo,这个demo演示了如何重写addObject:方法来记录每一个新添加的对象。

NSArray+Swizzle.h文件代码

#import <Foundation/Foundation.h>

@interface NSArray (Swizzle)

-(id)myLastObject;

@end

NSArray+Swizzle.m文件代码

#import "NSArray+Swizzle.h"

@implementation NSArray (Swizzle)

-(id)myLastObject{

    id ret=[self myLastObject];
    NSLog(@"This is myLastObject of wflytoc");
    return ret;
}

@end

main.m文件代码

#import <Foundation/Foundation.h>
#import "NSArray+Swizzle.h"
#import <objc/runtime.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Method ori_Mthod=class_getInstanceMethod([NSArray class], @selector(lastObject));
        Method my_Mthod=class_getInstanceMethod([NSArray class], @selector(myLastObject));
        method_exchangeImplementations(ori_Mthod, my_Mthod);

        NSArray *array=@[@"1",@"2",@"3"];
        NSString *string=[array lastObject];
        NSLog(@"last object is %@",string);
    }
    return 0;
}

结果:

Method Swizzling的方法

开发中总会遇到需要使用Method Swizzling的时候,记录一下Method Swizzling的正确方法一、方法以hookUIViewController 为例#import @impleme...
  • sinat_25544827
  • sinat_25544827
  • 2017年01月17日 12:01
  • 462

method-swizzling 详解 和使用

简介在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实...
  • Erice_e
  • Erice_e
  • 2017年06月15日 16:53
  • 517

iOS运行时与method swizzling

iOS中method swizzling的介绍
  • sakulafly
  • sakulafly
  • 2014年05月29日 22:36
  • 8411

Method Swizzling中的陷阱

这篇文章不是介绍什么是方法交换,这类文章很多,如果你不知道什么是方法交换可以看这篇文章:Method Swizzling...
  • dp948080952
  • dp948080952
  • 2017年02月05日 19:55
  • 354

iOS method swizzling详解1

Objective-C的hook方案(一):  Method Swizzling 在没有一个类的实现源码的情况下,想改变其中一个方法的实现,除了继承它重写、和借助类别重名方法暴力...
  • zrhloveswallow
  • zrhloveswallow
  • 2014年03月18日 18:27
  • 647

关于Method Swizzling

理解Method Swizzling是学习runtime机制的一个很好地机会 Method Swizzling是改变一个selector的实际实现的技术,通过这一技术,我们可以在运行时通过类的分类发...
  • sinat_31599813
  • sinat_31599813
  • 2015年11月17日 09:31
  • 267

iOS Method Swizzling方法替换

void swizzling_method(Class class,SEL orignSelector,SEL newSelector) { Method originM = class_ge...
  • Mid_Zed
  • Mid_Zed
  • 2015年03月20日 23:33
  • 540

iOS之运行时机制及方法混写method swizzling

runtime method swizzling
  • u011342466
  • u011342466
  • 2016年03月04日 15:30
  • 1059

iOS黑魔法之Method Swizzling

此黑魔法本应属于OC,它是基于Runtime实现的偷天换日大法。 那么什么是Method Swizzling呢?从字面意思来看叫方法协调,大概就是这个意思了。使用此魔法可以替换现有方法为自定义方法,...
  • zhaicaixiansheng
  • zhaicaixiansheng
  • 2016年08月19日 11:40
  • 590

iOS之方法变换(Method Swizzling)

C语言是静态语言,它的工作方式是通过函数调用,这样在编译时我们就已经确定程序如何运行的。而Objective-C是动态语言,它并非通过调用类的方法来执行功能,而是给对象发送消息,对象在接收到消息之后会...
  • LVXIANGAN
  • LVXIANGAN
  • 2017年07月26日 17:21
  • 327
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Method Swizzling
举报原因:
原因补充:

(最多只允许输入30个字)