objective-c中的method swizz实现"猴打补丁"

简介:

ruby中的猴打补丁很好实现,下面给出例子:

class String
    alias :org_upcase :upcase
    def upcase
        puts("trace me if you can :)")
        self.org_upcase
    end
end

十分短小精悍!在打补丁之后所有的upcase会完成任何我们需要的附加操作,无论是之前还是之后。
下面给出objc中类似的操作:

#import <Foundation/Foundation.h>

@interface NSString (HyTraceMe)
-(NSString*)org_uppercaseString;
@end

@implementation NSString (HyTraceMe)
-(NSString *)org_uppercaseString{
    NSLog(@"objc : trace me if you can :)");
    return [self org_uppercaseString];
}
@end

int main(void){
    @autoreleasepool{
        NSString *str = @"hEllO WoLRd!---";
        NSLog(@"%@",[str uppercaseString]);
        Method m = class_getInstanceMethod([NSString class],@selector(
            uppercaseString));
        Method org_m = class_getInstanceMethod([NSString class],@selector(
            org_uppercaseString));
        method_exchangeImplementations(m,org_m);
        NSLog(@"%@",[str uppercaseString]);
    }
    return 0;
}

代码很简单,首先创建NSString的一个分类,然后添加补丁方法;接下来交换原始方法和补丁方法,最后在补丁方法中调用原始方法,即类似于ruby中的:alias :org_method :method

相关文章
|
算法 数据安全/隐私保护 iOS开发
|
存储 缓存 iOS开发
深入Objective-C Runtime机制(一):类和对象的实现
1.概要      对于Runtime系统,相信大部分iOS开发工程师都有着或多或少的了解。对于Objective-C,Runtime系统是至关重要的,可以说是Runtime系统让Objective-C成为了区分于C语言,C++之外的一门独立开发语言,让OC在拥有了自己的面向对象的特性以及消息发送机制。并且因为其强大的消息发送机制,也让很多人认为Object
1954 0
|
存储 iOS开发
上古时代 Objective-C 中哈希表的实现
因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。 写在前面 文章会介绍上古时代 Objective-C 哈希表,也就是 NXHashTable : NXHashTable 的实现 NXHashTable 的性
1340 0
|
iOS开发
iOS,Objective-C,相册功能的实现。
#import "ViewController.h" #define kuan [UIScreen mainScreen].bounds.size.width #define gao [UIScreen mainScreen].
849 0