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,還能夠看看協議方法,此處略過