对于Objective-C运行时,我的一些理解

运行时到底是什么,我也不是特别的明白,我说不清完整的定义,所以只能说说自己对于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把对于方法是否实现的判断也推迟到了运行时。

这是我对于运行时的一些简单了解,有什么错误和不足的地方还请大神指教。

转载于:https://my.oschina.net/leejan97/blog/220113

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值