Objective-c编程语言(二):对象,类,消息 ——对象

2019/7/21 18:14:57 人评论 次浏览 分类:学习教程

原文链接:http://www.cnblogs.com/sjslibrary/archive/2011/08/09/2132129.html

此文章翻译自苹果官方文档原文地址:http://developer.apple.com/library/…/doc/uid/TP30001163-CH11-SW1

对象,类,消息

这一章介绍objective-c语言中有关对象,类,消息使用与实现的原理。同时简要介绍objective-c的运行时。

运行时系统

Objective-C语言在编译时、链接时直到运行时都是尽量的推迟做决定。只要可能它都是动态的执行诸如创建对象和调用方法的操作。因此 这个语言不仅仅需要一个编译器同时需要一个运行时系统去执行编译后的代码。运行时系统对于Objective-C就如同一个操作系统,它使语言能够工作。 一般情况下你不需要同运行时进行直接交互。想要了解更多关于运行时提供的功能请参考Objective-C Runtime Programming Guide.

对象

正如名字所表明的一样,面向对象程序是围绕着对象建立起来的。一个对象可以通过特定的操作来使用和影响数据。Objective-C 提供了一种数据类型来标识没有指定特定类型的对象。

对象基本原理

一个对象可以通过特殊的操作来使用和影响数据。在Objective-C中这些操作被叫做对象的方法,这些方法所影响的数据就是对象的实例变量(在其他的环境中他们可能被称为ivars或者成员变量)。实质上,对象就是将一个数据结构(实例变量)和一组程序(方法)捆绑到一个独立的编程单元。

在Objective-C中一个对象的实例变量是对象内部的。一般来说你只能通过对象的方法来访问对象的状态(你可以通过使用范围指令来指定子类或者其他的对象是否可以访问实例变量,参考“The Scope of Instance Variables”)对于其他对象想要获得一个对象一些东西都必须通过一个方法来获得信息。例如一个矩形需要有一个方法显示他的大小和位置。

另外对象只能看到那些为它设计的方法,它不能执行为其他类型对象准备的方法。好比C 的方法保护它的局部变量对其他的程序隐藏,对象也隐藏它的实例变量和它的执行方法。

id

在Objective-C中对象的标识符是一个单独的数据类型:id。这种类型是一种通用的类型可以是各种对象不管是什么类,可以是一个类的实例也可以是类对象本身。

1
id anObject;

对于Objective-C的面向对象结构,例如方法的返回值id代替int作为默认的返回值类型。(对于严格的C语言结构方法返回值的默认类型仍然是int)。

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

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

1
2
3
4
5
typedef struct objc_object {
 
    Class isa;
 
} *id;

每一个对象都有一个isa变量来表示它是哪个类的实例。由于类这个类型本身被定义为一个指针,因此isa变量经常被称为“isa 指针”。

1
typedef struct objc_class *Class;

动态分配类型

Id的类型是完全非限定的。对于id本身不产生任何关于对象的信息除了表明它是一个对象。在一些时候一个程序通常需要知道所包含的对象的具体信息。由于id类型指示器不能提供这些具体信息给编译器,每个对象就必须能够提供这些信息在运行时。

Isa实例变量标明了对象的——对象是什么类型。具有相同行为(方法)和相同类型的数据(实例变量)的对象是属于同一个类的成员。

对象是在运行时动态分配类型的。在任何需要的时候,运行时系统都能够通过询问对象而精确的知道对象所属于的类。(想要更多了解运行时,参考Objective-C Runtime Programming Guide.)Objective-C中的动态分配类型被作为动态绑定的基础,稍后会进行讨论。

Isa变量同时可以使对象进行自省——去查询自己或其他对象的信息。编译器会在数据结构中记录关于类定义的信息提供给运行时实用。运行时系统在运行时使用isa来查找这些信息。使用运行时系统你可以进行例如查找一个对象是否实现了一个特定方法或者查找它父类的名字。

对象类在后面会详细讨论。“Classes.”

同时也可以在代码中使用类名静态的给对象分配类型来告诉编译器。类是一种特殊的对象,并且类名可以当作类型名。参考 “Class Types” and“Enabling Static Behavior.”

内存管理

在任何程序中确保对不再需要的对象进行回收是非常重要的否则你实际使用的内存会比需要的大。同时确保正在使用的对象不被回收也是非常重要的。

Objective-C提供了两种内存管理的机制来实现这个目标:

  • 引用计数器,完全由你来决定对象的生命周期。参考Memory Management Programming Guide.
  • 垃圾回收,由一个自动的“回收器”来负责决定对象的生命周期。垃圾回收器参考in Garbage Collection Programming Guide。(垃圾回收器在IOS中不可用)
原文地址: http://www.sjslibrary.com/?p=212

转载于:https://www.cnblogs.com/sjslibrary/archive/2011/08/09/2132129.html

相关资讯

    暂无相关的资讯...

共有访客发表了评论 网友评论

验证码: 看不清楚?
    -->