runtime是属于OC的底层,可以进行一些非常底层的操作(用OC无法实现的,或者说不好实现)eg
相关的头文件// #import <objc/runtime.h> // #import <objc/message.h>//消息发送机制,可以直接用底层函数,进行消息发送 // 相关函数 // msg_send:给对象发送消息,来自<objc/message.h> // class_copyMethodList,遍历某个类中所有的方法,来自<objc/runtime.h> //#pragma mark 实例变量方法是什么意思 // class_copyIvarList,遍历某个类中所有的实例变量的方法,来自<objc/runtime.h>// 运行时必备常识:
// 1.Ivar:成员变量的意思 // 2.Method:成员方法的意思 // 3.property:属性
运行时归档,不用担心后期类增加属性,忘记添加归档
#import@interface Person : NSObject @property (nonatomic, strong) NSArray *picUrls;@property (nonatomic, copy) NSString *className;@property (nonatomic, assign) float score;@property (nonatomic, strong) NSNumber *number;- (void)demo;@end
Person.m文件
#import "Person.h"#import@implementation Person{ int _age; double _height; NSString *_name;}- (void)test{ NSLog(@"%s", __func__);}- (void)demo{ NSLog(@"%s", __func__);}/* - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:self.picUrls forKey:@"picUrls"]; [encoder encodeObject:@(self.score) forKey:@"score"]; [encoder encodeObject:self.className forKey:@"className"]; } - (id)initWithCoder:(NSCoder *)decoder { if (self = [super init]) { self.picUrls = [decoder decodeObjectForKey:@"picUrls"]; self.score = [[decoder decodeObjectForKey:@"score"] doubleValue]; self.className = [decoder decodeObjectForKey:@"className"]; } return self; } */-(void)encodeWithCoder:(NSCoder *)aCoder{ unsigned int count = 0; //1.取出所有的属性 objc_property_t *propertes = class_copyPropertyList([self class], &count); //2.遍历的属性 for (int i=0; i
延伸一下 runtime的使用
在控制器中我们可以测试用运行时获取 Person的实例变量,属性 ,私有和公开的方法
#import "ViewController.h"#import "Person.h"#import@interface ViewController (){ unsigned int couont;}@end@implementation ViewController-(void)viewDidLoad{ [super viewDidLoad]; couont = 0;}-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ //1.获取Person中所有的方法名称 [self test4];}//1.获取Person中所有的方法名称-(void)test1{ /** * 第一参数:需要获取的类 第二个参数:获取到的个数 */ Method *methds = class_copyMethodList([Person class], &couont); for (int i=0; i