002-runtime 实现方法交换

2017-02-24  本文已影响53人  紫荆秋雪_文

1、方法调用的一个流程

p调用方法过程.png

2、方法交换的应用场景

//
//  UIImage+image.m
//  002-runtime(方法交换)
//
//  Created by 紫荆秋雪 on 2017/2/24.
//  Copyright © 2017年 Revan. All rights reserved.
//

#import "UIImage+image.h"
#import <objc/runtime.h>

@implementation UIImage (image)
// 把类加载进内存的时候调用,只会调用一次
+ (void)load {
    // 获取imageNamed方法
    // 获取哪个类的方法
    Method imageNamedMethod = class_getClassMethod(self, @selector(imageNamed:));
    // 获取需要交换的方法
    Method revan_imageNamedMethod = class_getClassMethod(self, @selector(revan_imageNamed:));
    // 使用runtime来交换方法
    method_exchangeImplementations(imageNamedMethod, revan_imageNamedMethod);
}

//会被多次调用
//+ (void)initialize {
//
//}

+(UIImage *)revan_imageNamed:(NSString *)name {

    UIImage *image = [UIImage imageNamed:name];
    /// 扩展功能
    if (image) {
        NSLog(@"图片加载成功");
    } else {
        NSLog(@"图片加载失败-%@", name);
    }
    return image;
}

@end

//
//  ViewController.m
//  002-runtime(方法交换)
//
//  Created by 紫荆秋雪 on 2017/2/24.
//  Copyright © 2017年 Revan. All rights reserved.
//

#import "ViewController.h"
#import "UIImage+image.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UIImage *img = [UIImage imageNamed:@"1.png"];
    NSLog(@"%@", img);
}

@end

方法调用过程.png runtime交换方法后调用方法过程.png
//
//  UIImage+image.m
//  002-runtime(方法交换)
//
//  Created by 紫荆秋雪 on 2017/2/24.
//  Copyright © 2017年 Revan. All rights reserved.
//

#import "UIImage+image.h"
#import <objc/runtime.h>

@implementation UIImage (image)
// 把类加载进内存的时候调用,只会调用一次
+ (void)load {
    // 获取imageNamed方法
    // 获取哪个类的方法
    Method imageNamedMethod = class_getClassMethod(self, @selector(imageNamed:));
    // 获取需要交换的方法
    Method revan_imageNamedMethod = class_getClassMethod(self, @selector(revan_imageNamed:));
    // 使用runtime来交换方法
    method_exchangeImplementations(imageNamedMethod, revan_imageNamedMethod);
}

//会被多次调用
//+ (void)initialize {
//
//}

+(UIImage *)revan_imageNamed:(NSString *)name {

    UIImage *image = [UIImage revan_imageNamed:name];
    /// 扩展功能
    if (image) {
        NSLog(@"图片加载成功");
    } else {
        NSLog(@"图片加载失败-%@", name);
    }
    return image;
}

@end

//
//  ViewController.m
//  002-runtime(方法交换)
//
//  Created by 紫荆秋雪 on 2017/2/24.
//  Copyright © 2017年 Revan. All rights reserved.
//

#import "ViewController.h"
#import "UIImage+image.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UIImage *img = [UIImage imageNamed:@"1.png"];
    NSLog(@"%@", img);
}

@end

runtime交换方法后调用方法过程.png

3、小结

上一篇 下一篇

猜你喜欢

热点阅读