Objective-C Runtime Programming Guide

8 篇文章 0 订阅
1 篇文章 0 订阅

引言

Objective-C语言把许多执行从编译时和链接时推迟到运行时。 只要有可能,它就动态执行。这意味着该语言不仅需要一个编译器,还要有一个运行时系统执行编译后的代码。对于Objective-C语言,运行时系统是操作系统的一部分;使这门语言得以正常工作。

本文着眼于NSObject和Objective-C程序与运行时系统的交互。 特别是,它探讨了在运行时动态加载新类的模式,转发消息到其它对象。它还提供了在运行时如何找到对象的信息。

阅读此文档可以理解Objective-C运行系统是如何工作的,如何来利用它。虽然,通常情况下,没有什么理由让你需要知道和了解这种方式来写Cocoa应用程序。

 

参见

Objective-C Runtime Reference介绍了Objective-C运行时支持的数据结构和函数库。应用程序可以使用这些接口与Objective-C运行系统进行交互。例如, 添加类或方法,获取对加载的类中的所有类定义的列表。

Programming with Objective-C介绍了Objective-C语言。

Objective-C Release Notes介绍了OS X以来Object-C运行时的变化


 

运行时版本和平台

不同平台上的Objective-C运行时有不同的版本。

传统和现代版本

有两个版本的Objective-C运行时 - “现代”和“传统”。现代版介绍Objective-C2.0,并包括了一些新的功能。传统版本的编程接口在Objective-C1Runtime Reference中描述;现代的编程接口在Objective-CRuntime Reference中描述。

最显着的新特点是,在现代运行时中实例变量是“非脆弱”:

●  在传统运行时,如果你改变一个类的实例变量的布局,你必须重新编译所有从它继承的类。

●  在现代运行时,如果你改变一个类的实例变量的布局,你不必重新编译从它继承的类。

此外,现代运行时支持的实例变量合成为属性声明(见的Objective-C语言程序设计语言“属性声明”)。

平台

iPhone应用程序,OSX v10.5的64位程序及以后版本使用了现代版本的运行时。

其他程序(OSX桌面上的32位程序)使用运行时的旧版本。


 

与运行时交互

Objective-C程序的运行时系统在三个不同的层面进行交互:通过Objective-C源 代码;通过Foundation框架里在NSObject类中定义的方法;并通过直接调用 到运行时的功能。

Objective-C源代码

在大多数情况下,运行时系统自动地在幕后工作。可以通过编写和编译Objective-C源代码使用。

当你编译代码包含Objective-C类和方法,编译器创建的数据结构 和函数实现了语言的动态特性要求。在class和category中定义和protocol声明中获得数据结构信息;它们包含在“定义类”和“协议”里,以及选择方法(methodselector),实例变量模板,和其他源代码信息。典型的运行时函数是消息发送,见“消息”(第10页)。它通过源代码消息表达式来调用 。

NSObject方法

Cocoa中大多数对象都是NSObject类的子类,所以大部分对象都继承它定义的方法。 (值得注意的例外是NSProxy类,见“消息转发”(第18页))因此,每个实例,每一个类对象的创建行为都差不多。然而,在 少数情况下,NSObject类只定义了某些方法要做什么;但它不 提供所有必要的代码。

例如,NSObject类定义了一个返回一个字符串描述的实例方法。这主要是用于调试,GDB的打印对象命令打印 从这个方法返回的字符串。NSObject类的此方法的实现并不知道是什么类,所以它返回一个字符串的对象的名称和地址。NSObject类的子类可以实现 此方法来返回的详细信息。例如,Foundation中的NSArray返回对象包含的列表。

一些NSObject的方法简单地查询运行时系统的信息。这些方法允许对象 进行自举。例如类方法,它要求一个对象,以确定其类;isKindOfClass:和isMemberOfClass:,测试一个对象在继承层次结构中的位置;respondsToSelector:,指示对象是否可以接受一个特定的消息;conformsToProtocol:,指示对象是否声明实现了特定的协议的一个定义的方法;methodForSelector:,它提供了一个方法的实现的地址。 这些方法给对象获得关于自身信息的能力。

运行时函数

运行时系统是一个公共接口,包括一组函数和数据结构的动态共享库,内部头文件/usr/include/objc。许多这些函数使用C、Objective-C代码。其他形式的函数通过NSObject类的方法导出。这些函数使人们有可能开发其他接口的运行系统,并产生增强的开发环境工具;在使用Objective-C编程时,这没有必要的。然而,编写一个Objective-C程序时的几个运行时函数可能有时是有用的。所有这些功能都记录在Objective-CRuntime Reference .


 

消息发送

本章介绍如何将消息表达式转换成objc_msgSend函数调用,并 如何通过名称来引用方法。然后,它解释了如何利用objc_msgSend的优势, 如果你需要,你可以避开动态绑定。

objc_msgSend函数

Objective-C,直到运行时消息才绑定到方法实现。编译器转换消息表达式,

[receiver message]

插入一个消息发送函数objc_msgSend。该函数将接收器的名字,在该消息中提到的方法,方法选择器,它有两个主要参数:

objc_msgSend(receiver, selector)

在消息中传递任何参数也交给objc_msgSend:

objc_msgSend(receiver,selector, arg1, arg2, ...)

该消息函数做必要的动态绑定的一切:

●它首先找到的程序(方法实现)的选择器。因为同样的方法 可以通过不同的类,实现方式不同,它找到的确切步骤取决于 类的接收器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值