浅谈iOS运行时机制runtime(1)

学习iOS开发已经两年了,也做过一些iOS开发的小项目,对iOS开发多少有点自己的见解,接下来我来谈谈我对iOS中runtime机制的理解(由于本次是我第一次写博客,若书写中有错误,欢迎大家指出)。

进入主题,什么是runtime机制,其实就是运行时机制:对象的生成和消息的发送都是动态运行时生成的(运行时就是command+R,消息可以理解为函数的调用,如果你学过一门编程语言,那你应该知道函数的调用),如果你学过C或者C++,你可能知道它们都是编译性语言,也就是说函数调用是在编译的时候就已经指定了,如果函数只声明而没有实现那么在编译的时候是会报错的。而Objective-C是一门面相对象的语言,函数的调用是在运行是绑定的,也就是说如果函数只声明而不实现,那么在编译的时候是不会报错的(xcode中用command+B为编译)。

什么是运行是绑定呢,这里我举一个比较经典的例子,很多博客中都是用的这个例子:

打印结果如下:

如果是iOS开发的初学者,也许会认为第二个打印的应该是FatherClass,就和我当初一样也这么认为的。那为什么会答应都为SonClass呢,下面我做一个简单的解释:

这个函数是的作用是获取 aClass 类的名称,这样的话,第一个打印为SonClass

就好理解了,重点解释第二个结果为什么是SonClass。按照 NSStringFromClass([superclass]) 这个应该是去父类调用然后打印父类的名称。如果这么想的话,我们就进入了一个误区,

我们仔细想想,[self class]和[super class]中的 -(Class)class 这个方法到底是谁的,哪里调用的?我从xcode中的API调用一张图,如下:


可以看到,它是NSObject协议中的一个方法,而NSObject继承这个协议,因此,-(Class)class可以由NSObject对象调用,我们再来看一张苹果官方-(Class)class的实现方法


返回对象为当前的self对象所属的类。这样以来,就都说的通了。因为所有类都继承于NSObject类,所以都能调用-(Class)class方法。当程序运行是,调用[self class]时,先去本类中去找,

-(Class)class,没有找到,再去NSObject父类中去调用-(Class)class方法并返回当前类的对象,也就是SonClass的self,而当调用[super class]的时候,先去父类FatherClass中去找-(Class)class,

没有找到;再去NSObject类调用-(Class)class方法并返回当前类的对象(SonClass对象self)。因此两个NSLog函数都打印的是SunClass,谜团解开了。

相信大家通过上面的例子都隐约感受到,Objective-C的动态机制了。当程序运行时,对象才去调用方法,看本类中有没有实现该方法,如果没有找到,再去父类中去找,如果父类中再没有,

最后再到NSObject中去找,找到就调用,找不到就报错。

今天我就简单讲到这里,下一章,我将简单谈一下Objective-C是如何进行动态消息调用和转发的。欢迎大家收看,谢谢。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值