现在的位置: 首页 > 综合 > 正文

objective-c编程语言 第一章 对象,类和消息 第一小节 对象(objects)

2013年08月21日 ⁄ 综合 ⁄ 共 2285字 ⁄ 字号 评论关闭

Objective-C编程语言

-这是一份翻译,有关于objective-c,完全出于个人学习目的,共享给大家,如需转载请注明出处
原文地址:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html

第一章 对象,类和消息

本章节描述了由objective-c的对象,类和消息使用和实现的原理,也简要介绍了objective-c的运行时.

运行时系统(The Runtime System)

objc尽可能的延迟消息的调用,从编译时和连接时直到运行时.只要可能,诸如创建对象和到底调用哪个方法它都会动态的决定,而不是在编译或链接时决定.因此,它需要的不仅是一个编译器,同样还需要一个运行时系统来执行已经编译过的代码.运行时系统对于objc语言来说就像一个操作系统;它使这门语言能够工作.然而通常情况下,你并不需要直接跟运行时系统直接交互.要理解更多的关于运行时提供的功能,请查看Objective-C
Runtime Programming
Guide.

一、对象(Objects)

正如名字所显示的那样,面向对象的编程语言时围绕着对象而建立的.对象通过特定的可以使用或影响到数据的操作来与数据发生联系.objc提供了一种数据类型用来代表一个对象变量,使用这种数据类型不用指定该对象具体属于哪个类(id).

1、对象基础

对象通过特定的可以使用或影响到数据的操作来与数据发生联系.我们称这些操作为对象的方法(methods);方法所能影响的数据称之为对象的实例变量(instance variables)(在其它的语言中它们可能被称呼为ivars或成员变量).本质上讲,对象是将数据结构体即实例变量和一组操作(方法)捆绑在一起的独立的编程单元.

在objc中,对象的实例变量是内部的.通常情况下你只有通过对象的方法才能得知对象的状态(你可以指定实例变量是否可以被子类对象或其它对象直接访问通过范围指令,请查看The Scope
of Instance Variables
),对于其他的对象要想获得一个对象的一些东西,就必需有一个方法来提供这种信息.如一个矩形会包含方法来显示它的大小和位置.而且,对象只能看到那些为它设计的方法.它不能错误地执行为别的类型的对象设计的方法.就像时C语言保护它的局部变量,使它们对其它的程序时隐藏的一样,对象也会隐藏它的实例变量和方法的实现.

2、类型id

在objc中,对象标识符是唯一的一个数据类型:id.这种类型是通用的类型,用来表示那些无类型对象,也可以用于类的实例变量,以及类对象自己.

id anObject;

在objc的面向对象的组成结构中,如方法的返回值,id会代替int作为默认的返回值类型.(对于严格的C组成结构如过程返回值,int仍然作为默认的返回值类型).

关键字 nil 被定义为空对象,一个值为0的id类型对象.id,nil和其他的objc的基本类型在头文件objc/objc.h中定义.

id被定义成指向一个数据结构体的指针.

typedef struct objc_obj{

Class isa;

} *id;

因此,每个对象都有一个isa变量,isa指针可以用来指示此对象是哪个类的实例.由于Class类型被定义为一个指针.

typedef struct objc_class *Class;

因此isa变量经常被称呼为‘isa指针’.

3、动态归类(Dynamic Typing)

id类型是完全没有限制的.通过它,无法产生对象的任何信息,除了代表它是一个对象.在某些场合,一段程序通常需要知道他所包含的对象的更多的特定的信息.既然id类型无法提供这些特定的信息给编译器.每个对象就需要有能力在运行时提供这些信息.

isa实例变量能够指示对象的类,即它是什么类型的对象.拥有同样方法和实例变量的对象同属同一个类.

对象以此在运行时动态归类.无论何时需要,运行时系统都能找到对象到底属于哪个类,只要问下对象即可.(要学习更多的关于运行时系统,查看Objective-C Runtime Programming Guide.)动态归类在objc中提供了动态类型绑定(dynamic
binding)的基础,这将在稍后讨论.

isa变量同样能使对象有自行的能力,找出关于他们自己或其他的对象的信息.编译器在数据结构中记录类定义的信息,提供给运行时使用.运行时系统的功能是在运行程序时用isa来找到这些信息.通过运行时系统,你可以,例如,决定一个对象是否实现了一个特定的方法或者找到其父类的名字.

当然也可以静态的在源代码中用类名指定一个对象的类型.类时某种特定的对象,而且类名可以作为一种类型名使用.

4、内存管理(Memory Management)

在任何程序中,保证在对象没有被其他地方用到时就被析构(deallocated)时非常重要的,否则你的应用程序内存空间占用就会变得比必须的要大.当然保证对象在还用被使用时不被析构同样时非常重要的.

objc提供了两种内存管理的机制来满足这两个准则.

引用计数(Reference counting),你对对象的生命周期负全责. 引用计数在Memory Management Programming Guide中有描述.

垃圾回收,通过这种方式你将对象的生命周期的决定权交给自动对象collector.垃圾回首机制在Garbage
Collection Programming Guide
有描述.(对于IOS是不可用的).

抱歉!评论已关闭.