面向对象编程的基础知识
面向对象编程,首字母缩写OOP,Object-Oriented Programming。面向对象编程是以程序的数据为中心,函数为数据服务。面向过程则相反。使用了一段时间, 和C语言这种面向过程编程语言比较, 发现:很多便利, 比如减少代码的耦合性,减少编程压力, 让程序更灵活。在面向过程的C语言当中, 你会发现程序后期维护相比OOP变得异常困难。对象到底是什么, 它就像C语言
中的struct
。这个struct
当中有指针指向它的父类,有指针指向它的方法集, 有指针指向它的数据集(各种数据属性变量)。我想这种神奇的语言设计方案也是在大家受够了C语言
的程序维护带来的折磨发明出来的。回想一下现在的我们本身, 是不是觉得自己现在的日子过得不爽了, 想优化自身了, OC语言还有世界上所有的东西都是这么进化出来的。而现在轮到我们捡现成的, 学之致用,待他朝技能加满不满足于现状的你, 也能为世界添砖加瓦。 不要觉得难, 都是从简单进化出来的。 现在懂得少, 也许我说的比较肤浅。但是我相信自己的感悟是正确的。
[shape draw] OC的方法调用
上面我们简略的说了OC里的对象,这里来说说对象如何调用方法。上面的调用在OC
里称为消息机制。[shape draw]
shape对象接收到了draw
消息,或者说向shape
发送了draw
消息。至于怎么运行的, 取决于shape对象里对draw
的实现。现在说说shape
是怎么调用draw
消息的,调用的过程需要叫类的幕后帮手来完成。当使用shape
对象来调用draw
方法时,系统首先会查shape
对象属于哪个类,怎么查呢, 总要有理有据可循吧。 还记得之前说过,可以把对象看做类似的结构体,结构体内部有个指针指向它的类。丫的是结构体, 好办了, 如果我来设计, 肯定使劲往里面塞各种变量数据, 还有函数, 让它变成一个对象,为什么还要指针指向它的类呢。查了查百度, 发现前人没少像我这么想的, 哈哈。我说吧, 大家都不是傻子。但是OC并不是这样。 肯定有道理才不这么做, 不然进化的也太失败了不是。 这么做的好处就好比, 我喜欢吃的小龙虾, 但是不会做, 所以经常去会做的人那里买, 有一天做小龙虾的换了另一种口味, 而我不用去学也能吃到新的口味儿。对象和类的关系也一样, 对象shape
一旦被人从内存当中申请到一块内存, 它就有了自己的根据地, 根据地里只需要放入一个isa的指针。指针指向了用于存储draw方法的区域。这里有个步骤:
- 对象是消息目标, 先查查这家伙属于哪个类
- 在该类中查查
draw
在哪里(位置) - 找到了, 运行
draw
方法绘制它本身。
这一切都是都是类幕后来操作的, 这样设计程序语言能减少程序员很多错误,使之易于维护
这里我们学会了很多术语
- 类(class) 是一种表示对象类型的结构体。对象通过它的类可以获取到自身各种信息,尤其是执行每个操作需要运行的代码。一般程序都包含很多类。我们OC编程的时候应该使用首字母大写方式提醒大家这是一个类名
- 对象(object)是一种包含值和指向其类的隐藏指针的结构体。运行中的程序通常包含很多对象,指向对象的变量名就不用大写了
- 实例(instance)是对象的另一种称呼。
- 消息(message)是对象执行的一些操作,可以理解成通知对象要执行什么样的操作,对象发现消息以后就会去查它所属的类以及类里面的相应的消息来执行。
- 方法(method)是为了相应消息而运行的代码。根据对象所属的类,消息可以调用不同的方法。
- 方法调度(method dispatcher)是Objective-C使用的一种调度机制, 用于推测执行什么方法以响应某个特定的消息。
- 接口(interface)是类为对象提供的特性描述。通俗点就是告诉你它能为你做什么。
- 实现(implementation)是使接口能正常工作的代码。就好比C语言里面的函数申明和具体实现一样。