iOS进阶

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);
}

实例代码

[实例代码] https://pan.baidu.com/s/1ktH-eyCyjxHhC1QkB9l-9g

上一篇下一篇

猜你喜欢

热点阅读