1)Sense:
Teacher: Where is LiLei from?
XiaoMing: I don't know.
Teacher: Guess?.
LiHua: He is from __
在程序當中,假設XiaoMing的中沒有guess這個方法,后來被Runtime添加一個名字叫guess的方法,最終再調用guess方法做出相應。那么,Runtime是如何做到的呢?
①動態給XiaoMing類中添加guess方法:
class_addMethod([self.xiaoMing class], @selector(guess), (IMP)guessAnswer, "v@:");
這里參數地方說明一下:
(IMP)guessAnswer 意思是guessAnswer的地址指針;
"v@:" 意思是,v代表無返回值void,如果是i則代表int;@代表 id sel; : 代表 SEL _cmd;
“v@:@@” 意思是,兩個參數的沒有返回值。
②調用guess方法響應事件:
[self.xiaoMing performSelector:@selector(guess)];
③編寫guessAnswer的實現:
void guessAnswer(id self,SEL _cmd){
NSLog(@"He is from GuangTong");
}
這個有兩個地方留意一下:
1.void的前面沒有+、-號,因為只是C的代碼。
2.必須有兩個指定參數(id self,SEL _cmd)
-(void)answer{
class_addMethod([self.xiaoMing class], @selector(guess), (IMP)guessAnswer, "v@:");
????????????? if ([self.xiaoMing respondsToSelector:@selector(guess)]) {
????? ? ? ? ? ? ?? [self.xiaoMing performSelector:@selector(guess)];
????????????? } else{
????? ? ? ? ? ? ?? NSLog(@"Sorry,I don't know");
????????????? }
???????????????? self.cityTf.text = @"GuangTong";
}
void guessAnswer(id self,SEL _cmd){
???? NSLog(@"He is from GuangTong");
}