Objective-C 编程语言(2) 类,对象,消息 --- 运行时 对象

来源:互联网 发布:c ide 知乎 编辑:程序博客网 时间:2024/05/29 04:14
转载请标明出处:http://blog.csdn.net/zhangxingping

第一章 对象,类和消息


    本章将对Objective-C中使用和实现的对象,类和消息的基础知识进行描述。同时,本章也对Objective-C运行时进行介绍。

运行时

    Objective-C语言会尽量把做出决定的时间从编译时,延迟至连接时,更甚至是到运行时。只要有可能,Objective-C总是进行动态操作,例如动态创建对象,并判断应该调用哪个方法。因此,Objective-C语言不仅仅需要一个编译器,而且还需要运行时系统来执行编译好的代码。运行时可以看作是Objective-C语言的一种操作系统;正式运行时才使得Objective-C语言能正常工作。然而,一般情况下,我们不必直接和运行时进行交互。如果你还想了解更多的关于运行时提供的功能,请参阅《Objective-C 运行时编程指南》

对象

    正如其名字那样,面向对象的编程是基于对象的。通过对象把数据以及作用于这些数据的特此操作关联起来。Objective-C中提供了一种特殊的数据类型来标识对象变量,而不用知道这个对象具体是那个类的实例。

    对象的基本知识

    一个对象把数据以及作用于这些数据的操作关联起来,这些操作可以是使用这些数据也可以修改这些数据。在Objective-C中,这些操作被称为对象的方法;这些数据被称为实例变量(有时也被称为是成员变量)。实际上,一个对象是把数据结构和一组操作绑定到了一个程序单元中。

    在Objective-C中,对象的实例变量对于对象来说是内部的;通常情况下我们只能通过对象的方法来访问对象的状态。我们可以通过使用范围指令来指定其子类或者别的对象是否能直接访问对象的实例变量,这点参见“实例变量的作用域”这一小节。其他情况下,如果需要知道一个对象的信息,该对象就必须提供对应的方法。例如,一个矩形应该提供方法以便外界可以获取他的大小和位置。

    然而,对象只能感知到为其设计的那些方法;而不能错误的执行为别的类型的对象设计的方法。正如C语言中的函数内部的局部变量对外界是不可见的一样,对象对外界也是隐藏自己的实例变量以及方法的具体实现。

    id

    在Objective-C中,对象标识id是一种很特殊的数据类型。这种类型是所有对象都通用的,而和对象所属的类无关。这种类型可用于类的实例以及类对象本身。

    在Objective-C中,构造函数的返回值是id类型的。缺省情况下,函数的返回值也都是id类型的,而不是int类型的。

    关键字nil被定义为是空对象,也就是值为0的id。id,nil以及Objective-C中其他的一些基本数据类型是在头文件:objc/objc.h中定义的。

    id 被定义为是指向一个对象数据结构的指针:

    typedef struct objc_object    {        Class isa;    } * id;

    每一个对象都有一个isa变量,用来标明该对象是那个类的对象。由于Class 类型本身被定义为是一个指针:

    typedef struct objc_class * Class;

    所以,isa通常会被说成是“isa指针”。

    动态类型

    id类型的使用本身没有太多的限制。但这种类型本身除了表明了“是一个对象”这样的信息外,再没有关于该对象的任何其他信息。实际编程中,我们往往需要知道对象所包含的更多信息。既然id这种标识不能提供足够的信息给编译器,这就要求每个对象必须在运行的时候能够提供这些所需要的信息。

    isa实例变量标识了该对象所属的类——那就是该对象是那种类型的。有相同行为(方法)和相同类型数据(实例变量)的对象是都是同一个类的成员。

    在运行时,对象的类型是动态确定的。在需要的时候,运行时系统能够找出一个对象确切地属于那个类。这个只需要询问该对象即可。(更多信息,请参阅《Objective-C运行时编程指南》)Objective-C中的动态类型是后续我们要讨论的动态绑定的基础。

    isa变量还使得对象自身具有“自省”功能——也就是了解自身的信息。编译器在数据结构中记录了关于类的定义信息,以便运行时用。运行时的函数使用isa来在运行时查找这些信息。举例来说,通过使用运行时系统,我们可以判断一个对象是否实现了一些特定的方法,或者判断它的父类是那个类等。

    我们将在后面的章节中讨论更多关于类的细节。

    同样,我们在可以通过在编码的时候使用类名来静态地告诉编译器关于某个对象所属的类的信息。类是特殊的对象,类名可以作为类型名称来使用。更多信息参阅“类类型”以及“使能静态行为”相关章节

    内存管理

    在所有的程序中,确保对象在不需要的时候被正确销毁,所占用空间得到正确释放都是非常重要的。否则应用程序所占用的内存就会超出所需的大小,造成浪费。同样,确保不要错误地销毁还在被使用的对象,释放其空间也是非常重要的。

    Objective-c中提供了两种内存管理机制来达到上述目的:

  • 引用计数。使用这种机制时,对象的生命周期完全在我们的掌控之中,也完全由我们负责其内存的申请和释放。更多关于引用计数,参阅《内存管理编程指南》一书。
  • 垃圾回收。使用这种机制时,我们就把对象生命周期的管理交给了自动“回收器。更多关于垃圾回收机制请参阅《垃圾回收编程指南》一书。(iOS不支持垃圾回收机制,因此在iOS开发者中心是看不到这本书的。)