runtime直译就是运行时间,run(跑,运行) time(时间),网上你们都叫它运行时,它是一套比较底层的纯C语言API,属于一个C语言库,包含了不少底层的C语言API,它是OC的幕后工做者,咱们平时写的OC代码,在运行过程时,都会转为runtime的C语言代码面试
看到这有人要说啦,程序原本就在运行,跑着,有叼用?哦NO,我又不是猴子派来的逗逼。没用我浪费唾沫,貌似今晚没吃好饭,一会去你家吃啊,别看,谁看就说谁。仍是不要啦,接着看吧,不能由于我要去你家吃饭,你就错过精彩的一段啊。电视剧开了,主题来了。有很多人都用过MJExtension,喂,它是什么?别问,我又不是老师,本身谷歌去。查到了,json转model的吗,我会用,面试官来了,原理是什么?举头望明月,低头思原理,并不知道,pass.其实MJExtension实质就是应用runtime ,下面揭runtime的新娘遮盖头json
(1)新建个model类Studentatom
@interface Student : NSObjectspa
#pragma mark - 属性code
//姓名对象
@property (nonatomic, copy) NSString *name;开发
//性别字符串
@property (nonatomic, copy) NSString *sex;get
//年龄string
@property (nonatomic, assign) NSInteger age;
//分数
@property (nonatomic, assign) float score;
#pragma mark - 方法//作完做业
- (void)finish:(NSString *)name;
//考试(学生时代的苦逼事,上班时代的向往事啊)
- (void)exam;
@end
如今我想知道有哪些属性,看看runtime是怎么干的
//添加私有变量 @interface Student () //班级 @property (nonatomic, copy) NSString *class; @end //得到类的全部成员变量名 - (void)test1 { unsigned int count; //得到成员变量的结构体 Ivar *ivars = class_copyIvarList([Student class], &count); for (int i = 0; i < count; i++) { Ivar ivar = ivars[i]; //得到成员变量的名称 const char *name = ivar_getName(ivar); //由于runtime是基于c语言的,得到的是c字符串,转成oc字符串 NSString *key = [NSString stringWithUTF8String:name]; NSLog(@"%zd--- %@", i, key); } //这是干吗的,不给你说,哪能什么都告诉你啊 free(ivars); }
上面查看了全部成员变量,如今看看全部属性名
//得到类的全部属性名 - (void)test1 { unsigned int count; //得到成员变量的结构体 objc_property_t *propertys = class_copyPropertyList([Student class], &count); for (int i = 0; i < count; i++) { objc_property_t property = propertys[i]; //得到成员变量的名称 const char *name = property_getName(property); //由于runtime是基于c语言的,得到的是c字符串,转成oc字符串 NSString *key = [NSString stringWithUTF8String:name]; NSLog(@"%zd--- %@", i, key); } //此处必须释放,我都ARC了,释放什么啊,ARC那是什么,我表示不知道,它是释放的是Foundation对象,也就是OC对象,可我如今用的是coreFoundation啊,和你ARC有啥关系,好吧,我被说服了,放就放吧,逼着难受 free(propertys); }
查看student的全部方法
- (void)test3 { unsigned int count; Method *methods = class_copyMethodList([Student class], &count); for (int i = 0; i < count; i++) { Method method = methods[i]; //获取方法 SEL methodSEL = method_getName(method); //将方法转化为c字符串 const char *name = sel_getName(methodSEL); //转化为oc字符串 NSString *key = [NSString stringWithUTF8String:name]; NSLog(@"%zd--- %@", i, key); } free(methods); }
ofcourse,还能够看看协议方法,此处略过