方法的懒加载
顾名思义,当一个类中,并不存在一个方法,可以通过 runtime 去动态的创建他.
Person * p = [[Person alloc]init];
//调用eat方法
[p performSelector:@selector(eat:) withObject:@"板烧鸡腿堡"];
//...
@implementation Person
//当调用了一个没有实现的类方法
//+(BOOL)resolveClassMethod:(SEL)sel
//默认参数
//调用了一个没有实现的对象方法
+(BOOL)resolveInstanceMethod:(SEL)sel {
//添加一个方法eat
if (sel == @selector(eat:)) {
//IMP 方法实现 就是一个函数指针!!
//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
这里有一个知识点
动态的添加方法 --- class_addMethod([Person class], @selector(eat:), (IMP)eat, "v");
这里的第三个参数 (IMP)eat
存在一个知识点
- 之前说的
IMP
是一个方法的实现,实质上,就是一个函数指针. - 对 OC 而言,调用方法的实质,是调用函数.
可以简单的理解为,- 方法是形如
-(void)myMethod:(id)params
, - 函数是形如
void func(id objc, SEL _cmd, id realParam)
当方法被调用时,进入底层,调用对应的函数,此时会多传两个隐式参数, - id objc -- 代表的是方法的调用者,谁调用,就是谁.这里
- _cmd -- 代表的是方法名. SEL
- 方法是形如