方法的懶加載
顧名思義,當(dāng)一個(gè)類中,并不存在一個(gè)方法,可以通過 runtime 去動態(tài)的創(chuàng)建他.
Person * p = [[Person alloc]init];
//調(diào)用eat方法
[p performSelector:@selector(eat:) withObject:@"板燒雞腿堡"];
//...
@implementation Person
//當(dāng)調(diào)用了一個(gè)沒有實(shí)現(xiàn)的類方法
//+(BOOL)resolveClassMethod:(SEL)sel
//默認(rèn)參數(shù)
//調(diào)用了一個(gè)沒有實(shí)現(xiàn)的對象方法
+(BOOL)resolveInstanceMethod:(SEL)sel {
//添加一個(gè)方法eat
if (sel == @selector(eat:)) {
//IMP 方法實(shí)現(xiàn) 就是一個(gè)函數(shù)指針!!
//types:返回值類型
class_addMethod([Person class], @selector(eat:), (IMP)eat, "v@:@");
}
return [super resolveClassMethod:sel];
}
void eat(id objc,SEL _cmd,id obj){
NSLog(@"哥么吃了!!%@ ",obj);
}
@end
這里有一個(gè)知識點(diǎn)
動態(tài)的添加方法 --- class_addMethod([Person class], @selector(eat:), (IMP)eat, "v");
這里的第三個(gè)參數(shù) (IMP)eat存在一個(gè)知識點(diǎn)
- 之前說的
IMP是一個(gè)方法的實(shí)現(xiàn),實(shí)質(zhì)上,就是一個(gè)函數(shù)指針. - 對 OC 而言,調(diào)用方法的實(shí)質(zhì),是調(diào)用函數(shù).
可以簡單的理解為,- 方法是形如
-(void)myMethod:(id)params, - 函數(shù)是形如
void func(id objc, SEL _cmd, id realParam)
當(dāng)方法被調(diào)用時(shí),進(jìn)入底層,調(diào)用對應(yīng)的函數(shù),此時(shí)會多傳兩個(gè)隱式參數(shù), - id objc -- 代表的是方法的調(diào)用者,誰調(diào)用,就是誰.這里
- _cmd -- 代表的是方法名. SEL
- 方法是形如