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;
}

结果:

相关文章推荐

Objective-C运行时特性:Method Swizzling魔法

OC运行时特性,为我们提供了一个叫做Method Swizzling的方法魔法利器,利用它我们可以更加随心所欲的在运行时期间对编译器已经的方法再次动手脚,主要包括:交换类中某两个方法的实现、重新添加或...

Runtime Method Swizzling

前言 在我学习runtime的method swizzling特性之前,有很多同事或者朋友经常在我耳边说起swizzling特性,一个个在我面前说这个东西千万不能用,会引起很多问题的。但是,在我...

ios Method Swizzling

一.Method Swizzling介绍 objective-c 方法分为方法名(selector)和方法实现(IMP)两部分,当调用方法时,Objective-C运行时根据selecotr去找...

Method Swizzling

Thx: http://esoftmobile.com/2014/02/19/method-swizzling/ Method swizzling指的是改变一个已存在的选择器对应的实现的过程,它...

Objective-C的hook方案(一): Method Swizzling

在没有一个类的实现源码的情况下,想改变其中一个方法的实现,除了继承它重写、和借助类别重名方法暴力抢先之外,还有更加灵活的方法吗?在Objective-C编程中,如何实现hook呢?标题有点大,计划分几...

IOS Method Swizzling 替换方法 Objective-C的hook方案

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

Method Swizzling

在上周associated objects一文中,我们开始探索Objective-C运行时的一些黑魔法。本周我们继续前行,来讨论可能是最受争议的运行时技术:method swizzling。 ...

iOS - Method Swizzling

Method Swizzling 通过改变特定 selector(方法)与实际实现之间的映射,在 runtime 时将一个方法的实现替换成其它方法的实现。 用途:替换UIViewController...

iOS runtime Method Swizzling(方法交换)的应用场景实例

iOS中有各类容器的概念,容器分可变容器和非可变容器,可变容器一般内部在实现上是一个链表,在进行各类(insert 、remove、 delete、 update )难免有空操作、指针越界的问题。 ...

Method Swizzling

Method Swizzling 原理 在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用Objective-C的动态特性...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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