Oriental Design Space
using C/Cpp/ObjC
posts - 0,comments - 0,trackbacks - 0

Objects, Classes, and Messaging

这章描述了ObjC语言所使用和实现的对象,类,和消息机制的基本。同时介绍了ObjC的动态运行时。

The Running System

ObjC语言之所以慢是因为从编译、链接时间到运行时有着许多的决定需要做。只要有可能,编译器会自动地增加许多操作:诸如创建对象,决定调用哪个方法(method)。因此,这个语言不仅仅需要的是一个编译器,而是一个运行时系统能够执行编译的代码。这个运行时系统扮演着ObjC语言的操作系统,它使得这个语言能够工作。然而,一般来讲我们并不需要与运行时直接打交道。为了更多地了解运行时所提供的功能,不过可以参见Objective-C Runtime Programming Guide

Objects

如题所述,面向对象编程总是围绕着对象(objects)而建立的。对象关联着数据和特殊的操作,它们能够使用或改变这些数据。ObjC语言提供了一种数据类型能够识别一个对象变量而无需指定特定的对象的类。

Object Basics

对象关联着数据和特殊的操作,它们能够使用或改变这些数据。在ObjC中,这些操作被称为对象的方法;它们所改变的数据被称为实例变量(instance variable)(在其他的环境中,它们被称为ivars或成员变量)。从根本上来说,一个对象绑定着一个数据结构(实例变量)和一组程序(方法)到一个自我封闭的编程单元中。

ObjC中,对象的实例变量时对象的内部;通常而言,你只能通过对象的方法获取对象的状态(你可以通过范围指示(scope directive)指定子类或其他对象可以获得的实例变量,参见The Scope of Instance Variables Page40)。对于其他的需要找到与对象相关的东西,则必须有一个对象能够提供相关的信息。例如,长方形需要有方法显示他的尺寸和位置。

再多说点,一个对象只能看到为他设计的方法;它不可能错误地使用为其他的类型的对象而设计的方法。正如C函数一样会保护自己局部变量,使得他们对程序的其余部分是隐藏的。一个对象隐藏自己的实例变量和方法的实现。

id

ObjC中,对象标识符时一个独特的数据类型:id。这个内型时任何对象的通用内型,无论何种类。可以用作一个类的实例和类对象自身。

id anObject;

对于由ObjC构建起来的面向对象,如方法的返回值,id代替了int作为默认的数据类型。(对于严格的C构建,比如函数的返回值,int仍然是默认的类型。)

关键词nil被定义成空对象,拥有id0.idnil以及其他的ObjC的基本数据类型被定义在头文件objc/objc.h中。

Id被定义成指针指向对象的数据结构:

typedef struct objc_object {

       Class isa;

} *id;

这样,每个对象都拥有一个isa变量,可以告诉我们它是哪个类的实例。因为Class类型本身就定义成了一个指针:

typedef struct objc_class *Class;

isa变量通常称为isa指针。

Dynamic Typing

Id类型是完全非限制的。就其自身而言,它不产生关于对象的任何信息,除了它是一个对象。在某些时候,一个程序特别需要找到对象所含的特别信息。因此,id类型设计师不能提供特别的信息给编译器,那么每个对象需要在运行时提供它们。

Isa实例变量能够标示对象的类---表明他是什么类型的对象。有着相同行为(method)和相同数据(实例变量)的对象是同一个类的成员。

因此,对象是在运行时动态指定的。当有必要时,运行时系统可以找到所属的对象,只要通过问对象(想了解更多,参见Objective-C Runtiming Programming GuideObjC中的动态类型是动态绑定的基础,在稍后的章节我们继续讨论。

Isa变量可以使对象进行自省(即,对象可以通过自身的isa变量可以自己属于哪个类)--- 能够找出自己的信息(或者其他的对象。)编译器会在数据结构中记录有关类定义的信息,供运行时系统使用。运行时系统函数使用isa找到有关运行时的信息。例如,使用运行时系统,你可以决定一个对象是否实现了一个特殊的方法或者找到父类的名字。

对象类在Class(第19页)章节有更详细的讨论。

也有可能要给编译器有关对象类的静态类型,这种类型是通过类名在源文件中指定的。类是对象的特殊类型,类名可以用作类型名。参见Class Types(第23页) Enabling Static Behavior (83)

Memory Management

在任何程序中,当对象不再需要时,确保它能够被销毁时非常重要的---否则你的应用程序的内存的footprint就会变得非常大。同时,当对象正在使用时,确保对象不能够被删除。

ObjC提供了三种机制使得内存管理可以达到以上的目标

l         自动引用计数(Automatic Reference Counting):其中编译器可以推断对象的使用期。

l         手动引用计数(Manual Reference Counting):其中你可以完全自主地决定对象的使用期。

l         垃圾收集(Garbage collection):其中你可以把决定对象使用期的职责转交给自动收集器。

垃圾收集在Garbage Collection Programming Guide中有表述(iOS不可用)

Object Message

本节解释了发送消息的语法,包括

posted on 2012-02-09 23:11 alzhang 阅读(92) 评论(0)  编辑 收藏 引用 所属分类: Objective C翻译

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理