学习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是如何进行动态消息调用和转发的。欢迎大家收看,谢谢。