Runtime簡(jiǎn)稱運(yùn)行時(shí)王浴,OC就是運(yùn)行時(shí)機(jī)制,也就是運(yùn)行時(shí)候的一些機(jī)制夕玩,其中最重要的就是 消息機(jī)制哈打。
對(duì)于C語(yǔ)言,函數(shù)的調(diào)用在編譯的時(shí)候會(huì)決定哪個(gè)函數(shù)調(diào)用
對(duì)于OC的函數(shù),動(dòng)態(tài)函數(shù),在編譯的時(shí)候并不能真正的決定調(diào)用哪個(gè)函數(shù),只有在真正運(yùn)行的時(shí)候衅谷,才會(huì)根據(jù)函數(shù)名找到對(duì)用的函數(shù)來(lái)調(diào)用。
runtime作用?
1.方法調(diào)用的本質(zhì)似将,就是讓對(duì)象發(fā)送消息获黔。objc_msgSend,只有對(duì)象才能發(fā)送消息,故objec開(kāi)頭
2.使用消息機(jī)制前提在验,必須導(dǎo)入import<objc/message.h>
? Person*p = [[Personalloc]init];
? ? objc_msgSend(p,@selector(eat));
? ? objc_msgSend(p,@selector(run:),30);
方法調(diào)用的流程:對(duì)象方法:類對(duì)象的方法列表里面? ? ?類方法:元類方法列表中
比如eat方法:1.通過(guò)isa指針去對(duì)用的類中查找? 2.把方法名轉(zhuǎn)化成方法編號(hào)? 3.根據(jù)方法標(biāo)號(hào)去查找對(duì)應(yīng)的方法
runtime動(dòng)態(tài)交換方法:(image的分類中這樣寫)
+ (void)load{
? MethodimgeMethod =class_getClassMethod(self,@selector(imageNamed:));
? MethodxhwImageMethod =? class_getClassMethod(self,@selector(xhw_imageNamed:));
? method_exchangeImplementations(imgeMethod, xhwImageMethod);
}
+ (UIImage*)xhw_imageNamed:(NSString*)name{
//xhw_imageNamed:會(huì)去掉用imageName這個(gè)方法玷氏,
? ? UIImage*image = [UIImage xhw_imageNamed:name];
? ? if(image==nil) {
? ? ? ? NSLog(@"加載失敗");
? ? }else{
? ? ? ? NSLog(@"加載成功");
? ? }
? ? returnimage;
}