runtime系列1--Objective-C Runtime Programming Guide简介

简介

相对于C/C++来说,Objective-C尽可能地把一些动作从编译阶段推迟到运行时来执行,即尽可能的动态地做事情。因此,它不仅需要一个编译器,还需要一个“运行时”环境来执行编译后的代码。Runtime就好比是Objective-C的操作系统,使得Objective-C代码能够按照既定的语言特性跑起来。

本篇文章会讨论NSObject类Objective-C程序如何与Runtime System交互,尤其是运行时如何动态地加载类、如何发消息给其它对象,以及运行时如何获取对象信息

 你通过阅读本文章,可以对Objective-C的Runtime System 运行机制有更好的理解,并且知道如何更好的使用它,虽然通常来讲,在你开发应用的时候,不会太多用到这个基层的东西。

运行版本和平台

Objective-C runtime 在不同的平台上使用不同的版本。

Objective-C runtime,有2个版本:“modern” and “legacy”. modern 版本是在  Objective-C 2.0 介绍的,并且包含了很多新特性。 legacy 版本的使用接口是在  Objective-C 1 Runtime Reference介绍的。modern版本的使用接口 是在 Objective-C Runtime Reference介绍的。

Modern版本的Runtime System有一个显著的特征:实例变量是“non-fragile”,

  •  legacy runtime中,父类的成员变量的布局发生改变时,子类需要重新编译
  •  modern runtime中, 父类的成员变量的布局发生改变时,子类不需要重新编译

此外,还支持为声明的属性进行合成操作(即@property@synthesis)。

iPhone 应用和 OS X v10.5 之后的 64-bit 使用 modern  runtime.其他使用 legacy runtime。

与Runtime的交互

Objective-C程序和Runtime System在三个不同层次进行交互: 通过Objective-C源码;通过NSObject定义的函数;以及通过直接调用runtime 函数

Objective-C源码

通常来讲,Runtime System都是在幕后自动工作的,当我们编写和编译Objective-C代码时会用到它。

当我们编译包含Objective-C的类和方法时,编译器会为我们创建相应的数据结构和函数调用来实现语言的动态特性。这些数据结构保存着在类、Category定义和Protocol声明中所能找到的信息(这些类和协议在The Objective-C Programming Language 中“Defining a Class” and “Protocols”有介绍) ,包括成员变量模板,selectors,以及其它从源码中提取到的信息。

最主要的Runtime函数是用来发送消息的,它由源码中的消息表达式激发,详情参见 “Messaging.”介绍的(后续博客Messaging有详细翻译)。

NSObject 方法

Cocoa中大部分类都是NSObject的子类(NSProxy是一个例外),继承了NSObject的方法。因此它的方法制定了基本的行为方式,并遗传给所有继承者们。但是,有些情况下,NSObject只是定义一个如何实现的模板,并不提供详细的代码,(这样其实就是实现多态和动态性)。

比如NSObject定义的description方法,返回描述class自身内容的字符串,类似Python中开头的三引号,主要用于debugging(调试)。NSObject这个方法的实现并不知道class包含什么,只是返回类的名字和对象指针地址,NSObject的子类可以重写这个方法用来返回更多的内容。比如,NSArray可以返回它所包含的对象的详情列表。.

一些NSObject定义的方法只是简单地询问Runtime System获得信息,使得对象可以进行自省(introspection),比如一些类方法:用来确定类类型的方法isKindOfClass:,确定对象在继承体系中的位置的isMemberOfClass:,判断一个对象是否能接收某个特定消息的respondsToSelector:,判断一个对象是否遵循某个协议的conformsToProtocol:,以及提供方法实现地址的methodForSelector:。这些方法让一个对象可以进行自省(introspect about itself)。


Runtime 函数

Runtime System是一个动态共享库,位于/usr/include/objc,拥有一套由一系列函数和数据结构组成公共的接口。开发人员可以使用纯C调用一些函数来做编译器做的事情,或者扩展Runtime System,为开发环境制作一些工具等等。尽管一般情况下,编写Objective-C并不需要了解这些内容,但有时候会很有用.所有的函数都在 Objective-C Runtime Reference有介绍。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值