runtime机制

2016-02-24  本文已影响183人  王蓝胖

runtime是什么

runtime,即运行时机制。
runtime是一套底层的纯C的API,是一个C语言库。
平时写的OC代码,最终都会转成runtime的C语言代码,runtime的幕后工作者。

比如:
在OC中:

[[Person alloc] init];

在runtime中:

objc_msgSend(objc_msgSend("Person","alloc"),"init");

runtime的应用

#import <Foundation/Foundation.h>

@interface NSObject (Ex)

@property (nonatomic, copy) NSString *name;

@end
#import "NSObject+Ex.h"
#import <objc/runtime.h>

char namekey;

@implementation NSObject (Ex)

//关联对象函数
// id object被关联的对象
// const void *key关联键
// id value 关联值
// objc_AssociationPolicy policy 关联策略
- (void)setName:(NSString *)name{
    objc_setAssociatedObject(self, &namekey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name{
    return objc_getAssociatedObject(self, &namekey);
}

@end

相关方法和头文件

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIImageView *view = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    view.image = [UIImage imageNamed:@"pic_1"];
    [self.view addSubview:view];
    
}

@end
#import "UIImage+ExTension.h"
#import <objc/runtime.h>

@implementation UIImage (ExTension)
//+ (void)load 只在加载时调用一次
+ (void)load{
    NSLog(@"image load");
    
//get类方法
    Method m1 = class_getClassMethod([UIImage class], @selector(imageNamed:));
    Method m2 = class_getClassMethod([UIImage class], @selector(my_imageNamed:));
    //方法交换
    method_exchangeImplementations(m1, m2);
}

//自定义方法
+ (UIImage *)my_imageNamed:(NSString *)name{
    //方法已经被置换,所以此时调用的my_imageNamed:实际上调用的是原方法imageNamed:
    return [UIImage my_imageNamed:@"pic_2"];
}

@end

程序执行结果显示的就是pic_2,而不是pic_1。方法交换可以用于拦截在运行时拦截一些方法,在执行完自己想要的操作后再跳回该方法。

runtime常识:
Ivar:成员变量,在runtime中,变量只有一个数据类型,就是Ivar
Method:成员方法

上一篇下一篇

猜你喜欢

热点阅读