OC方法的懒加载
2019-01-19 本文已影响0人
泰克2008
前言
iOS中,大家都比较熟悉属性的懒加载,其实OC方法也能懒加载。在程序运行时,去加载指定方法,可以起到节约性能的作用。
方法的调用
在A类中没有声明methodA就去调用 [A methodA],XCode会直接报错,如果使用 performSelector:或performSelector:(SEL)aSelector withObject 方法,则可以编译通过。
Pseron *p = [[Pseron alloc]init];
//懒加载 用到的时候在加载方法!!
[p performSelector:@selector(eat)];
[p performSelector:@selector(eat:) withObject:@"板烧鸡腿堡"];
解决思路
1、根据OC的消息发送机制,我们知道当对象调用了没有实现的方法!就会执行该方法 +(BOOL)resolveInstanceMethod:(SEL)sel
//当这个类被调用了没有实现的方法!就会来到这里
+(BOOL)resolveInstanceMethod:(SEL)sel{
NSLog(@"你没有实现这个方法%@",NSStringFromSelector(sel));
return [super resolveInstanceMethod:sel];
}
2、使用RunTime的动态添加方法(class_addMethod(Class cls, SEL name, IMP imp, const char * types))来实现
//当这个类被调用了没有实现的方法!就会来到这里
+(BOOL)resolveInstanceMethod:(SEL)sel{
// NSLog(@"你没有实现这个方法%@",NSStringFromSelector(sel));
if (sel == @selector(eat)) {
/*
1.cls: 类类型
2.name: 方法编号
3.imp: 方法实现,函数指针!
4.types:函数类型 C字符串(代码) void === "v"
*/
class_addMethod([Pseron class],sel, (IMP)eat, "v@:");
}else if(sel == @selector(eat:)){
class_addMethod([Pseron class], sel, (IMP)eat1, "v@:@");
}
return [super resolveInstanceMethod:sel];
}
//C语言的
//所有的C语言的函数里面!都有这两个隐式参数!只要调用,哥么系统都会传递进来!
void eat(id self, SEL _cmd){
NSLog(@"调用了%@对象的%@方法",self,NSStringFromSelector(_cmd));
}
void eat1(id self, SEL _cmd,id obj){
NSLog(@"哥么今晚吃五个%@",obj);
}