26

原创内容转载请注明来源http://www.hjide.com/article/626.htm

对象

就像对象这名字所指的一样,面向对象编程都是围绕着对象进行的。对象和数据之间是通过一系列特定的能使用和操作数据的操作联系在一起的。在Objective-C里这些特定的操作是对象的函数(方法);他们能操作的是对象的实例变量。本质上对象就是一段程序代码,这段代码包含一系列数据和一组函数。

举个例子,假设你写一个画图程序,这个程序能划线、圆、矩形、文字和位图等等,你可能会创建一个所有这些基本形状的类来给用户使用。一个矩形对象的实例应该包含这个矩形的位置,长和宽,矩形的颜色和是否填充以及矩形的线条样式。一个矩形类应该还有一些方法来设置矩形的位置、大小、颜色、填充状态和线条样式,这些方法一起影响这个矩形的展现。

       在Object-C里一个对象的实例的变量是对象的内部变量,通常你访问一个对象的状态只能通过对象的方法(你可以用scope directives来让子类或者其他对象直接访问对象实例中的变量)。其他访问对象状态的途径只能通过对象所提供的方法返回的信息。举个例子,一个矩形对象会提供表面自己大小和位置的方法。

       此外,一个对象仅能发现为他设计的方法,它不会错误的执行来自其他对象的方法。就像在C函数中的函数变量对于其他函数来说是不存在一样,对象的实例变量和方法实现对外也是隐藏的。

id

在Objective-C对象的唯一标识是一个不重复的数据类型id。这是一个指向对象的指针,实际上是指向该对象实例的指针,该对象的唯一数据。就像C函数或者数组那样,它的内存地址是它们的唯一标识。所有的对象他们的内部变量和方法都可以认为是id类型。

id也是一个对象

       在Objective-C的面向对象里,方法的返回值id代替了int成为默认的返回类型(在标准C里int是方法的默认返回类型)。

关键字nil是预定义的一个空的对象,id的值是0。Objective-C 中的id,nil和其他基本数据类型在头文件objc/objc.h中定义。

动态类型匹配

id的类型并没有严格的限制,除了是一个对象之外他并不提供其他信息。

但是并不是所有的对象都一样的,矩形对象与位图具有不同的方法和变量。 某些时候程序需要找到这些对象的特殊信息,这些信息包括对象包含哪些内部变量,哪些可以执行的方法等等。Id类型不能自编译期开始提供这些信息,他们只能在运行时提供。

让这成为可能是因为每个类对象都包含一个描述这个对象是什么类型isa实例。每一个矩形对象都能告诉运行时系统这是一个矩形对象。每个圆型对象都会说他们是个圆形对象。同一个类都具有相同的方法和相同的数据类型(内部变量)。

       这样对象就具有了在运行时动态类型匹配的能力。一旦需要运行时系统就能找到对象所属的类信息。动态类型匹配是Objective-C中动态绑定和discussed later的基础。

       Isa指针还能执行反射找到来找到这些对象。编译器会记录类的数据结构定义给运行时系统使用。系统通过使用isa在运行时找到这些信息。这样你就能在运行时检查一个对象是否提供一个特定的方法或者获取这个对象的父类。

类对象将在下面的章节中详细介绍。

编译器也能提供类对象的信息,源代码中类的名字也作为一个固定的对象类型。类是一个特殊的对象,类的名字就是对象的类型。See “Class Types” (page 23) and “Enabling Static Behavior” (page 87).

对象消息

这一节将说明发送消息的语法,以及如何发送消息。同时也将讨论对象中的变量的可见性以及有关多态和动态绑定的概念。


Tags: , , ,

作者:Jock

Leave a Reply

You must be logged in to post a comment.

Switch to our mobile site