运行时到底是什么,我也不是特别的明白,我说不清完整的定义,所以只能说说自己对于OC运行时的简单理解了。我们在点击Xcode的Run按钮的时候,其实内部发生了很多的事情,也就是编译的过程,简单地说就是:编译->链接->生成目标文件,这是大多数语言在编译的时候经历的过程,目的是把人类能看懂的代码(Objective-C、C、Java。。。)转换成计算机能够识别的010110...二进制代码。
我们一直学习OC,不经过对比真的不是那么容易了解动态语言(例如OC)和静态语言(例如C++)的区别,因为项目中用到C++,所以简单地看了一点,有一句话让我豁然开朗,就是对于C++静态语言特性的解释:C++是一门静态类型语言,在编译时候会作类型检查。也就是说C++对于语法的要求极为严格,你代码中的逻辑错误在编译的时候就给你指出来;而OC相对来说就不那么严格了,比如一个UIButton对象btn关联的事件,
[backBtn addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];
,而btnClicked方法你没有实现,Xcode在编译的时候是不会报错的,而在运行的时候因为没有找到btn对应的点击方法btnClicked,这时候程序会crash,这种unrecognized selector错误,相信iOS码农深有体会;还比如实现一个协议,协议中有@required修饰的方法-(void)requiredMethod;,也就是必须要实现,这时候如果没有实现这个方法,编译的时候是不会报错的,只会有一个黄色的警告,但在运行时候调用到这个方法的时候,因为找不到这个方法,程序会crash,所以有时候为了防止这个错误,要写上如下判断语句
if ([self.delegate respondsToSelector:@selector(requiredMethod)]) {
[self.delegate requiredMethod];
}
来避免程序crash。
也就是说OC不仅仅把类型的判断推迟到了运行时,声明的方法、协议中的方法即使你没有实现也不会编译错误,因为OC把对于方法是否实现的判断也推迟到了运行时。
这是我对于运行时的一些简单了解,有什么错误和不足的地方还请大神指教。