OC懒加载方法

2,995 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

提到懒加载,或许99%搞iOS开发的同学都会用过,众所周知,懒加载就是用到的时候再加载,通常我们都用作属性上面,通过self.xx来实现。那么OC方法的懒加载你听说过吗?用过吗?下面就是通过runtime来实现一下方法的懒加载,玩一下。

首先创建一个Person类,.h文件里面什么都不用写

image.png

ViewController中导入头文件开始玩

image.png

viewdidload方法中初始化person并调用person的eat方法,此时可以看到xcode编译警告eat方法,如果我们现在运行代码,就会crash,因为找不到这个方法,找到Person.m

image.png

Objective C 提供了一种名为动态方法决议的手段,使得我们可以在运行时动态地为一个 selector 提供实现。我们只要实现 +resolveInstanceMethod: 或 +resolveClassMethod: 方法,并在其中为指定的 selector 提供实现即可(通过调用运行时函数 class_addMethod 来添加)。这两个方法都是 NSObject 中的类方法,其原型为:

  • (BOOL)resolveClassMethod:(SEL)name; 

 + (BOOL)resolveInstanceMethod:(SEL)name;

简单来说就是,当这个类被调用了没有实现的方法,就会进入该方法来。

参数 name 是需要被动态决议的 selector;返回值文档中说是表示动态决议成功与否。但在上面的例子中(不涉及消息转发的情况下),如果在该函数内为指定的 selector  提供实现,无论返回 YES 还是 NO,编译运行都是正确的;但如果在该函数内并不真正为 selector 提供实现,无论返回 YES 还是 NO,运行都会 crash,道理很简单,selector 并没有对应的实现,而又没有实现消息转发。

resolveInstanceMethod 是为对象方法进行决议,

而 resolveClassMethod 是为类方法进行决议。

先简单运行一下代码,打印一下SEL看看方法是什么

image.png

可以清楚的看到就是之前调用的eat,接下来用动态方法决议手段来修改上面的代码:

image.png

解析:

image.png