Objective-c 特性之多态、动态类型和动态绑定

本文深入探讨了Objective-C语言的动态特性,包括动态类型、动态绑定及多态性,并通过实例说明了这些特性如何在运行时确定对象所属的类及需要调用的方法。
Objective-c 语言是动态语言,所以使它具有动态类型和动态绑定的特性。

多态:来自不同类的对象可以定义相同名字的方法(之前有专门一篇博文具体讲解在iOS中的多态实现)
动态类型:这一特性是程序直到执行时才确定对象所属的类
动态绑定:它能使程序直到执行时才确定对象需要调用的实际方法(它与SEL一起实现了objc的多态)


多态在实际的使用中简单概括就叫相同的名称,不同的类

例如:

Dog *dog = [[Dog alloc] init];

[dog cry];

[dog release];

Cat *cat = [[Cat alloc] init];

[cat cry];

[cat release];

猫和狗都有cry这个方法,那么系统在运行时是如何知道应该执行谁的cry方法呢?因为我们是明确的将cat和dog分别定义为类Cat和Dog的对象,而objectvie-c总是跟踪对象所属的类,所以这些信息能使系统在运行时知道应该执行哪个类的cry方法。


动态绑定和id类型

id类型是一种通用的对象类型,它可以用来存储属于任何类的对象,以这种方式在一个变量中存储不同类型的对象时,在程序的执行期间,这种数据类型真正的优势就体现出来了

例如:

id animal;

Dog *dog = [[Dog alloc] init];

Cat *cat = [[Cat alloc] init];

animal = dog;

[animal cry];

animal = cat;

[animal cry];

[dog release];

[cat release];

由于animal是可以存储任何类型的对象,那么系统如何知道该调用哪一个类的方法呢?

因为Objective-c动态类型的特征所以系统在运行时会先判定对象所属的类,所以当animal调用cry方法的时候系统会先检查animal中存储的对象所属的类,然后才会去动态的找到该类的cry方法并执行它。


编译时和运行时检查

因为存储在id变量中的对象类型在编译的时候是无法确定的,所以一些事情是需要在运行时才能够确定。

例如:类Dog只有一个run方法,而类Cat只有一个jump方法,那么下面这段代码在编译的时候就是会出错

Dog *dog = [[Dog alloc] init]; [dog jump]; [dog release];

因为编译器知道dog是Dog类的一个对象,而当遇到[dog jump]消息的时候,编译器同样知道Dog类是没有jump方法的,所以在编译阶段就会提出警告。但是如果将代码换成下面的样子在编译阶段就不会出错

id dog = [[Dog alloc] init];
[dog jump];
[dog release];

因为在编译阶段编译器并不知道dog中存储的对象的类型是什么,所以在运行的时候程序就会crash


id数据类型与静态类型

虽然说id数据类型可以存储任何类型的对象,但是不要养成滥用这种通用类型的习惯,原因如下:

首先,将一个变量定义为特定类的对象时,使用的是静态类型,在编译的时候就知道这个变量所属的类,这个变量总是存储特定类的对象。使用静态类型时,编译器尽可能的确保变量的用法在程序中始终保持一直,编译器能够通过检查来确定应用于对象的方法是由该类定义的或者由该类继承的,否则就会显示警告。静态类型能够更好的在程序编译阶段就指出错误。并且使用静态类型可以提高程序的可读性。


动态类型的参数和返回类型

如果使用动态类型来调用一个方法,就需要注意:在多个类中实现名称相同的方法,那么每个方法的参数和返回值都必须要符合定义的时候的类型,这样编译器才能为消息表达式生成正确的代码。因为如果参数和返回类型的参数和返回类型是动态的,那么不同类的同名方法用着不同类型的参数,编译的时候编译器可能会不能正确的选取参数的类型。
根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值