Cocoa基本原理指南之二 - Cocoa对象

摘自:Cocoa基本原理指南

每个Objective-C对象都隐藏着一个数据结构,它的第一个成员变量或者说是实例变量“isa指针(大多数剩下的成员变量由对象的类或超类来定义)。顾名思义,isa指针指向的是对象的类,这个类也是一个对象,有自己的权限,是根据类的定义编译而来的。类对象负责维护一个方法调度表,该表本质上是由指向类方法的指针组成的;类对象中还保留一个超类的指针,该指针又有自己的方法调度表和超类(还有所有通过继承得到的公共和保护的实例变量)。isa指针对消息分发机制和Cocoa对象的动态能力很关键。

Objective-C比其它编程语言具有更强的动态能力,这种能力来源于如下三个方面:

<!--[if !supportLists]-->1. <!--[endif]-->动态类在运行时确定对象的类

<!--[if !supportLists]-->2. <!--[endif]-->动态绑定在运行时确定要调用的方法

<!--[if !supportLists]-->3. <!--[endif]-->动态装载在运行时为程序增加新的模块

Objective-C为动态类型引入了一个称为id的数据类型,用于表示任意的Cocoa对象。id数据类型使我们有可能在运行时进行任意的对象替换。动态类型使对象中的关联可以在运行时确定,而不需要在静态设计时强制指定对象类型。编译时的类型检查可以确保更加严格的数据完整性,但是作为交换,动态类型则给您的程序更大的灵活性。动态类型为Objective-C的第二种动态能力动态绑定提供了物质基础。正如动态类型将对象类的确定推迟到运行时一样,动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一起,只有在消息确实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接收者和被调用的方法。运行时的消息分发机制为动态绑定提供支持。动态装载是最后一种动态能力。它是Cocoa的一个特性,依赖于Objective-C的运行环境支持。通过动态装载,Cocoa程序可以在需要的时候才装载执行代码和资源,而不是在启动的时候装载所有的程序组件。可执行代码(在装载之前就连接好了)通常包含一些新的、会被集成到应用程序运行时映像的类。代码和本地化资源(包括nib文件)被包装在程序包中,可以通过Foundation框架中的NSBundle类中定义的方法来显式装载。

Objective-C在基本语言上做了两个扩展:范畴(categories)和协议(protocols),它们是强大的软件开发工具。这两个扩展引入了声明方法并将它们关联到某个类的技术。

范畴提供一种为某个类添加方法而又不必制作子类的途径。范畴中的方法会变成类的一部分,并为该类的所有子类所继承。在运行时,原始方法和通过范畴添加的方法之间没有差别,可以向类(或者它的子类)实例发送消息,以调用范畴中定义的方法。范畴不仅是一种为类添加行为的便利方法,还可以对方法进行分组,将相关的方法放在不同的范畴中。范畴对于组织规模大的类特别方便,例如当几个开发者同时在一个类上工作时,甚至可以将不同的范畴放在不同的源文件中。范畴有一些限制。您不能通过范畴为类添加新的实例变量。可以通过范畴来为根类—NSObject—添加方法。通过这种方式添加的方法可以用于与该代码相连接的所有实例和类对象。非正式的协议—Cocoa委托机制的基础NSObject类中声明为范畴。

Objective-C的另一个扩展称为协议,它非常象Java中的接口。两者都是通过一个简单的方法声明列表发布一个接口,任何类都可以选择实现。协议中的方法通过其它类实例发送的消息来进行调用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值