一起养成写作习气!这是我参加「日新计划 4 月更文应战」的第1天,点击检查活动概况。
提到懒加载,或许99%搞iOS开发的同学都会用过,众所周知,懒加载就是用到的时候再加载,一般咱们都用作属性上面,经过self.xx来完成。那么OC办法的懒加载你听说过吗?用过吗?下面就是经过runtime来完成一下办法的懒加载,玩一下。
首先创建一个Person类,.h文件里边什么都不用写

ViewController中导入头文件开端玩

viewdidload办法中初始化person并调用person的eat办法,此刻能够看到xcode编译正告eat办法,假如咱们现在运转代码,就会crash,由于找不到这个办法,找到Person.m

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看看办法是什么

能够清楚的看到就是之前调用的eat,接下来用动态办法抉择手法来修改上面的代码:

解析:
