Runtime

   什么是runtime?

1> runtime是一套底层的C语言API(包含很多强大实用的C语言数据类型、C语言函数)

2> 实际上,平时我们编写的OC代码,底层都是基于runtime实现的

* 也就是说,平时我们编写的OC代码,最终都是转成了底层的runtime代码(C语言代码)

runtime有啥用?

1> 能动态产生一个类、一个成员变量、一个方法

2> 能动态修改一个类、一个成员变量、一个方法

3> 能动态删除一个类、一个成员变量、一个方法

常见的函数、头文件

#import <objc/runtime.h> : 成员变量、类、方法

Ivar * class_copyIvarList : 获得某个类内部的所有成员变量

Method * class_copyMethodList : 获得某个类内部的所有方法

Method class_getInstanceMethod : 获得某个实例方法(对象方法,减号-开头)

Method class_getClassMethod : 获得某个类方法(加号+开头)

method_exchangeImplementations : 交换2个方法的具体实现

#import <objc/message.h> : 消息机制

objc_msgSend(receiver,selector)

objc_msgSend(receiver,selector,arg1,arg2...) 

//
//  HMPerson.h
//  05-runtime
//
//  Created by apple on 14-8-21.
//  Copyright (c) 2014年 heima. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface HMPerson : NSObject <NSCoding>
@property (nonatomic, assign) int age;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) double height;
- (void)run;
@end
/*小小例子
ViewController.m导入头文件 #import <objc/message.h>
-(void)viewDidLoad{
[super viewDidLoad];
HMPerson *p = [ [HMPerson alloc]init];
objc_msgSend(p,@selector(setAge),20);   //相当于 p.age=20;
NSLog(@"%d",p.age);
//打印出来20,说明平常写的oc代码都是runtime 代码的
} 
 
*/
//
//  HMPerson.m
//  05-runtime
//
//  Created by apple on 14-8-21.
//  Copyright (c) 2014年 heima. All rights reserved.
//
#import "HMPerson.h"
#import <objc/runtime.h>
@implementation HMPerson
- (void)run
{
    NSLog(@"run----");
}
- (void)encodeWithCoder:(NSCoder *)encoder
{
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([HMPerson class], &count);
    for (int i = 0; i<count; i++) {
        // 取得i位置的成员变量
        Ivar ivar = ivars[i];
        const char *name = ivar_getName(ivar);
        NSString *key = [NSString stringWithUTF8String:name];
        [encoder encodeObject:[self valueForKeyPath:key] forKey:key];
    }
}
@end


你可能感兴趣的:(Runtime)