导航:首页 > 文档加密 > cocoapdf

cocoapdf

发布时间:2022-08-08 17:47:41

1. Cocoa如何应用设计模式求解答

Cocoa经常把自己与众不同的工作机制建立在模式上,它的设计受到诸如语言能力或现有架构这样因素的影响。 本部分包含设计模式:可重用的面向对象软件的元素一书中编目的大多数设计模式的介绍。每个设计模式都有一个总结性的描述,以及该模式的Cocoa实现的讨论。文中列出的都是Cocoa实现的模式,每个模式的讨论都发生在特定的Cocoa环境中。我们推荐您熟悉这些模式,您会发现这些模式在Cocoa软件开发中非常有用。 Cocoa中设计模式的实现有不同的形式。下面部分中描述的一些设计—比如协议和范畴—是Objective-C语言的特性;在另外一些场合中,“模式的实例”被实现为一个类或一组相关的类(比如类簇和单件类);还有一些场合下,模式表现为一个大的框架结构,比如响应者链模式。对于某些基于模式的机制,您几乎可以“免费”使用;而另外一些机制则要求您做一些工作。即使对于Cocoa没有实现的模式,我们也鼓励您在条件许可的情况下自行实现,比如在扩展类的行为时,对象合成(装饰模式)技术通常就比生成子类更好。 有两个设计模式没有在下面的内容中进行讨论,即模型-视图-控制器(MVC)模式和对象建模。MVC是一种复合或聚合模式,就是说它基于几种不同类型的模式。对象建模在四人组的分类目录中没有对应类别,它源自关系数据库领域。然而,MVC和对象建模在Cocoa中可能是最重要和最普遍的设计模式或用语,而且它们在很大程度上是相关的。它们在几个技术的设计中发挥关键的作用,包括绑定、撤消管理、脚本控制、和文档架构。要了解更多有关这些模式的信息,请参见"模型-视图-控制器设计模式"和"对象建模"部分。 本部分包含如下主要内容:抽象工厂模式适配器模式责任链模式命令模式合成模式装饰模式表观模式跌代器模式仲裁者模式备忘录模式观察者模式代理模式单件模式模板方法模式 抽象工厂模式提供一个接口,用于创建与某些对象相关或依赖于某些对象的类家族,而又不需要指定它们的具体类。通过这种模式可以去除客户代码和来自工厂的具体对象细节之间的耦合关系。 类簇类簇是一种把一个公共的抽象超类下的一些私有的具体子类组合在一起的架构。抽象超类负责声明创建私有子类实例的方法,会根据被调用方法的不同分配恰当的具体子类,每个返回的对象都可能属于不同的私有子类。 Cocoa将类簇限制在数据存储可能因环境而变的对象生成上。Foundation框架为NSString、NSData、NSDictionary、NSSet、和NSArray对象定义了类簇。公共超类包括上述的不可变类和与其相互补充的可变类NSMutableString、NSMutableData、NSMutableDictionary、NSMutableSet、和NSMutableArray。 使用和限制 当您希望创建类簇代表的类型的可变或不可变对象时,可以使用类簇中的某个公共类来实现。使用类簇是在简洁性和扩展性之间进行折衷。类簇可以简化类接口,因此使其更易于学习和使用,但是创建类簇抽象类的定制子类则会变得更加困难。进一步阅读: "类簇" 部分提供有关Cocoa类簇的更多信息。 适配器模式将一个类接口转化为客户代码需要的另一个接口。适配器使原本由于兼容性而不能协同工作的类可以工作在一起,消除了客户代码和目标对象的类之间的耦合性。 协议协议是一个编程语言级别(Objective-C)的特性,它使定义适配器模式的实例成为可能(在 java中的“接口”和“协议”是同义的)。如果您希望一个客户对象和另一个对象进行交流,但由于它们的接口不兼容而导致困难,您就可以定义一个协议,它本质上是一系列和类不相关联的方法声明。这样,其它对象的类就可以正式采纳该协议,并通过实现协议中的全部方法来“遵循”该协议。结果,客户对象就可以通过协议接口向其它对象发送消息。 协议是一组独立于类层次的方法声明,这样就有可能象类的继承那样,根据对象遵循的协议对其进行分组。您可以通过NSObject的conformsToProtocol:方法来确认一个对象的协议关系。 除了正式协议之外,Cocoa还有一个非正式协议的概念。这种类型的协议是NSObject类中的一个范畴(category),这样就使所有的对象都成为范畴方法的潜在实现者(参见"范畴"部分)。非正式协议的方法可以选择性地实现。非正式协议是委托机制实现的一部分(参见"委托"部分。 请注意,协议的设计和适配器模式并不完全匹配。但它是使接口不兼容的类在得以协同工作的手段。 使用和限制 协议主要用于声明层次结构上不相关的类为了互相通讯而需要遵循的接口。但是,您也可以将协议用于声明对象的接口,而隐藏相应的类。Cocoa框架包括很多正式协议,这些协议使定制子类可以和框架进行特定目的的通讯。举例来说,Foundation框架中包含NSObject、NSCopying、和NSCoding协议,都非常重要。Application Kit中的协议包括NSDraggingInfo、NSTextInput、和NSChangeSpelling。 正式协议要求遵循者实现协议声明的所有方法。它们也是零碎的,一旦您定义一个协议并将它提供给其它类,将来对协议的修改会使那些类不能工作。进一步阅读:有关正式协议的更多信息请参见Objective-C编程语言文档中“扩展类”部分的讨论。 责任链模式通过为多个对象提供处理请求的机会,避免请求的发送者和接收者产生耦合。将接收对象串成链,并将请求沿着接收者链进行传递,直到某个对象对其进行处理。对象或者处理该请求,或者将它传递给链中的下一个对象。 响应者链Application Kit框架中包含一个称为响应者链的架构。该链由一系列响应者对象(就是从NSResponder继承下来的对象)组成,事件(比如鼠标点击)或者动作消息沿着链进行传递并(通常情况下)最终被处理。如果给定的响应者对象不处理特定的消息,就将消息传递给链中的下一个响应者。响应者在链中的顺序通常由视图的层次结构来决定,从层次较低的响应者对象向层次较高的对象传递,顶点是管理视图层次结构的窗口对象,窗口对象的委托对象,或者全局的应用程序对象。事件和动作消息在响应者链中的确切传递路径是不尽相同的。一个应用程序拥有的响应者链可能和它拥有的窗口(甚至是局部层次结构中的视图对象)一样多,但每次只能有一个响应者链是活动的—也就是与当前活动窗口相关联的那个响应链。 还有一个与响应者链相类似的链,用于应用程序的错误处理。 视图层次的设计应用的是合成模式(参见"合成模式"部分),它和响应者链密切相关。动作消息—源自控件对象的消息—基于目标-动作机制,是命令模式(参见"命令模式"部分)的一个实例。 使用和限制 当您通过Interface Builder或以编程的方式为程序构造用户界面时,可以“免费”得到一个或多个响应者链。响应者链和视图层次结构一起出现,当您使一个视图对象成为窗口内容视图的子视图时,视图层次结构就自动生成了。如果您将一个定制视图加入到一个视图层次结构中,它就变成响应者链的一部分;如果您实现了恰当的NSResponder方法,就可以接收和处理事件及动作消息。定制对象是窗口对象或全局应用程序对象NSApp的委托对象,也可以接收和处理那些消息。 您也可以用编程的方式将定制的响应者对象注入到响应者链中,以及通过编程操作响应者在链中的顺序。进一步阅读: 处理事件和动作消息及程序错误的的响应者链在Cocoa事件处理指南和Cocoa的错误处理编程指南文档中进行描述。本文档在"合成模式"部分对视图层次结构有总结性的介绍,在"核心应用程序架构"部分有更全面的描述。 命令模式这种模式将请求封装为对象,使您可以用不同的请求来对客户代码进行参数化;对请求进行排队和记录,并支持可撤消(undoable)的操作。请求对象将一或多个动作绑定在特定的接收者上。命令模式将发出请求的对象和接收及执行请求的对象区分开来。 调用对象NSInvocation类的实例用于封装Objective-C消息。一个调用对象中含有一个目标对象、一个方法选择器、以及方法参数。您可以动态地改变调用对象中消息的目标及其参数,一旦消息被执行,您就可以从该对象得到返回值。通过一个调用对象可以多次调用目标或参数不同的消息。 创建NSInvocation对象需要使用NSMethodSignature对象,该对象负责封装与方法参数和返回值有关系的信息。NSMethodSignature对象的创建又需要用到一个方法选择器。NSInvocation的实现还用到Objective-C运行环境的一些函数。 使用和限制NSInvocation对象是分布式、撤消管理、消息传递、和定时器对象编程接口的一部分。在需要去除消息发送对象和接收对象之间的耦合关系的类似场合下,您也可以使用。 分布式对象是一种进程间通讯技术,关于这个主题的更多信息请参见"代理模式"部分。进一步阅读:调用对象的细节请阅读NSInvocation的类参考文档。您也可以从下面的文档中获取相关技术的信息:Objective-C编程语言文档中的分布式对象、撤消架构、定时器以及之后的部分。 目标-动作目标-动作机制使控件对象—也就是象按键或文本输入框这样的对象—可以将消息发送给另一个可以对消息进行解释并将它处理为具体应用程序指令的对象。接收对象,或者说是目标,通常是一个定制的控制器对象。消息—也被称为动作消息—由一个选择器来确定,选择器是一个方法的唯一运行时标识。典型情况下,控件拥有的单元对象会对目标和动作进行封装,以便在用户点击或激活控件时发送消息(菜单项也封装了目标和动作,以便在用户选择时发送动作消息)。目标-动作机制之所以能够基于选择器(而不是方法签名),是因为Cocoa规定动作方法的签名和选择器名称总是一样的。 使用和限制 当您用Interface Builder构建程序的用户界面时,可以对控件的动作和目标进行设置。您因此可以让控件具有定制的行为,而又不必为控件本身书写任何的代码。动作选择器和目标连接被归档在nib文件中,并在nib文件被解档时复活。您也可以通过向控件或它的单元对象发送setTarget:和setAction:消息来动态地改变目标和动作。 目标-动作机制经常用于通知定制控制器对象将数据从用户界面传递给模型对象,或者将模型对象的数据显示出来。Cocoa绑定技术则可以避免这种用法,有关这种技术的更多信息请参见Cocoa绑定编程主题文档。 Application Kit中的控件和单元并不保持它们的目标。相反,它们维护一个对目标的弱引用。进一步的信息请参见"委托、观察者、和目标的所有权" 部分。进一步阅读:更多信息请参见"目标-动作机制"部分。 合成模式这种模式将互相关联的对象合成为树结构,以表现部分-全部的层次结构。它使客户代码可以统一地处理单独的对象和多个对象的合成结果。 合成对象是模型-视图-控制器聚集模式的一部分。 视图层次结构 一个窗口包含的视图对象(NSView对象)在内部构成了一个视图层次结构。层次结构的根是窗口对象(NSWindow对象)和它的内容视图。内容视图就是填充到窗口内容方框中的透明视图,添加到内容视图中的视图都是它的子视图,而这些子视图又会成为下一级视图的父视图。一个视图有一个(且只有一个)父视图,可以有零或多个子视图。在视觉上,您可以将这个结构理解为包含关系:父视图包含它的子视图。图4-2显示视图层次的结构以及在视觉上的关系。 图4-2 视图层次的结构及其在视觉上的关系 视图层次是一个结构方面的架构,在图形描画和事件处理上都扮演一定的角色。一个视图有两个影响图形操作位置的边界框,即边框(frame)和边界(bound)。边框是外部边界,表示视图在其父视图坐标系统中的位置,它负责定义视图的尺寸,并根据视图边界对图形进行裁减。边界则是内部的边界框,负责定义视图对象自身描画表面的内部坐标系统。 当窗口系统要求一个窗口做好显示准备时,父视图会在其子视图之前被要求进行渲染。当您向一个视图发送消息时—比如发送一个重画视图的消息—该消息就会被传播到子视图。因此,您可以将视图层次结构中的一个分支当成一个统一的视图来处理。 响应者链也把视图层次用于处理事件和动作消息。请参见责任链模式部分中("责任链模式")关于响应者链的总结描述。 使用和限制 无论以编程的方式,还是通过Interface Builder,当您将一个视图加入到另一个视图中时,都需要创建或修改视图层次结构。Application Kit框架自动处理与视图层次结构相关联的所有关系。进一步阅读:如果需要了解更多视图层次结构的信息,请阅读本文档的"视图层次结构"部分。Cocoa描画指南文档中也对视图层次结构进行讨论。 装饰模式这种模式动态地将额外的责任附加到一个对象上。在进行功能扩展时,装饰是子类化之外的一种灵活的备选方法。和子类化一样,采纳装饰模式可以加入新的行为,而又不必修改已有的代码。装饰将需要扩展的类的对象进行包装,实现与该对象相同的接口,并在将任务传递给被包装对象之前或之后加入自己的行为。装饰模式表达了这样的设计原则:类应该接纳扩展,但避免修改。 一般性的说明 装饰是用于对象合成的模式。在您自己的代码中应该鼓励使用对象的合成(参见"什么时候需要生成子类"部分)。然而,Cocoa自己提供了一些基于这种模式的类和机制(在下面的部分进行讨论)。在这些实现中,扩展对象并不完全复制它所包装的对象的接口,虽然具体实现中可以使用不同的技术来进行接口共享。 Cocoa在实现某些类时用到了装饰模式,包括NSAttributedString、NSScrollView、和NSTableView。后面两个类是复合视图的例子,它们将其它一些视图类的对象组合在一起,然后协调它们之间的交互。 委托委托是在宿主对象中嵌入一个指向另一对象(也就是委托对象)的弱引用(一个未保持的插座变量),并不时地向该委托对象发送消息,使其对有关的任务进行输入的机制。宿主对象一般是一个“复活”的框架对象(比如一个NSWindow或NSXMLParser对象),它寻求完成某项工作,但又只能以一般的方式来进行。委托几乎总是一个定制类的实例,它负责配合宿主对象,在有关任务的特定点(参见图4-3)上提供与具体程序有关的行为。这样,委托机制使我们可以对另一个对象的行为进行修改或者扩展,而不需要生成子类。 图4-3 框架对象向它的委托对象发送消息 简而言之,委托就是一个对象将任务委托给另一个对象,它是面向对象编程的常用技术。然而,Cocoa以独特的方式实现委托机制。宿主类用非正式协议—即NSObject中的范畴—来定义委托对象可能选择实现的接口。委托对象不必象采纳正式协议那样实现所有的协议方法。在向委托对象发送消息之前,宿主对象可以首先确定相应的方法是否实现(通过respondsToSelector:消息),以避免运行时例外。有关正式协议和非正式协议的更多信息,请参见"协议"部分。 Cocoa框架中的一些类也向它们的数据源发送消息。数据源在各个方面都和委托一样,除了它的目的是为宿主对象提供数据,以传递给浏览器、表视图、或者类似的用户界面视图。和委托不同的是,数据源还必须实现某些协议方法。 委托不是装饰模式的严格实现。宿主(委托)对象并没有包装它希望扩展的类的实例。相反,委托是对委托框架类的行为进行特殊化。除了框架类声明的委托方法之外,它们也没有公共的接口。 Cocoa中的委托也是模板方法模式("模板方法模式")的一部分。 使用和限制 委托是Cocoa框架中的一种常用的设计。Application Kit框架中的很多类都向它们的委托发送消息,包括NSApplication、NSWindow、和NSView的几个子类。Foundation框架中的一些类,比如NSXMLParser和NSStream,也维护自己的委托。您应该总是使用类的委托机制,而不是生成类的子类,除非委托方法不能完成您的目标。 虽然您可以动态地改变委托,但是同时只能有一个对象可以成为委托。因此,如果您希望当特定的程序事件发生时,有多个对象可以同时得到通知,则不能使用委托。在这种情况下您可以使用通告机制。如果委托对象实现了一或多个框架类声明的通告方法,就会自动接收到其委托框架对象的通告。请参考观察者模式( "观察者模式")中有关通告的讨论。 Application Kit框架中的向外委托任务的对象并不保持它们的委托或数据源,而是维护一个弱引用,更多信息请参见"委托、观察者、和目标的所有权"部分。进一步阅读:关于委托的进一步信息请参见"委托和数据源"部分。 范畴范畴是Objective-C语言的一个特性,用于为一个类增加方法(接口和实现),而不必生成子类。类原始声明的方法和通过范畴添加的方法在运行时没有区别—在您的程序的作用范围内。范畴中的方法成为类类型的一部分,并被所有的子类继承。 和委托一样,范畴并没有严格适配装饰模式。它实现了该模式的目的,但采用不同的实现方式。范畴加入的行为是在编译时生成的,而不是动态得到的。而且,范畴并没有封装被扩展的类的实例。 使用和限制 Cocoa框架中定义了很多范畴,大多数都是非正式协议(在"协议"部分中进行总结)。它们通常使用范畴来对相关的方法进行分组。您也可以在代码中实现范畴,以在不生成子类的情况下对类进行扩展,或者对相关的方法进行分组。但是您需要注意如下两点: 您不能为类添加实例变量。 如果您对现有的方法进行重载,则应用程序可能产生预料之外的行为。进一步阅读: 更多有关范畴的信息请参见Objective-C编程语言一文中的“类的扩展”部分。 表观模式这种模式为子系统中的一组接口提供统一的接口。表观模式定义一个更高级别的接口,通过减少复杂度和隐藏子系统之间的通讯和依赖性,使子系统更加易于使用。 NSImageNSImage类为装载和使用基于位图(比如JPEG、PNG、或者TIFF格式)或向量(EPS或pdf格式)的图像提供统一的接口。NSImage可以为同一个图像保持多个表示,不同的表示对应于不同类型的NSImageRep对象。NSImage可以自动选择适合于特定数据类型和显示设备的表示。同时,它隐藏了图像操作和选择的细节,使客户代码可以交替使用很多不同的表示。 使用和限制 由于NSImage支持几种不同的图像表示,因此某些属性可能不能适用。举例来说,您可能不能取得图像中一个像素的颜色,如果潜在的图像表示使基于向量且与设备无关的话。请注意:NSImage和图像表示的讨论请参见Cocoa描画指南。 迭代器模式这种模式提供一种顺序访问聚合对象(也就是一个集合)中的元素,而又不必暴露潜在表示的方法。迭代器模式将访问和遍历集合元素的责任从集合对象转移到迭代器对象。迭代器定义一个访问集合元素的接口,并对当前元素进行跟踪。不同的迭代器可以执行不同的遍历策略。 NSEnumerator Foundation框架中的NSEnumerator类实现了迭代器模式。NSEnumerator抽象类的私有具体子类返回的枚举器对象可以顺序遍历不同类型的集合—数组、集合、字典(值和键)—并将集合中的对象返回给客户代码。NSDirectoryEnumerator是一个不紧密相关的类,它的实例可以递归地枚举文件系统中目录的内容。 使用和限制 象NSArray、NSSet、和NSDictionary这样的集合类都包含相应的方法,可以返回与集合的类型相适用的枚举器。所有的枚举器的工作方式都一样。您可以在循环中向枚举器发送nextObject消息,如果该消息返回nil,而不是集合中的下一个对象,则退出循环。 仲裁者模式这种模式定义的对象用于封装一组对象的交互机制。仲裁者模式可以避免对象之间显式的互相引用,使对象之间的耦合变得宽松,也使您可以独立地改变它们的交互方式。这些对象也因此可以更具重用性。 仲裁者对象集中了系统中的对象之间的复杂通讯和控制逻辑。这些对象在状态发生改变时会告诉仲裁者对象,反过来,也对仲裁者对象的请求进行响应。 控制器类模型-视图-控制器设计模式为一个面向对象的系统(比如一个应用程序)中的对象分配不同的角色。它们可以是模型对象,包含应用程序的数据及对那些数据进行操作;可以是视图对象,负责表示数据及响应用户动作;也可以是控制器对象,负责协调模型和视图对象。控制器对象适合于仲裁者模式。 在Cocoa中,控制器对象一般有两个类型:仲裁控制器或者协调控制器。仲裁控制器负责仲裁应用程序中视图对象和模型对象之间的数据流。仲裁控制器通常是NSController对象。协调控制器则负责实现应用程序的集中化通讯和控制逻辑,作为框架对象的委托和动作消息的目标。它们通常是NSWindowController对象或定制NSObject子类的实例。由于协调控制器高度专用于特定的程序,因此不考虑重用。 Application Kit框架中的NSController抽象类和它的具体子类是Cocoa绑定技术的一部分,该技术可以自动同步模型对象包含的数据和视图对象中显示及编辑的数据。举例来说,如果用户在一个文本框中编辑一个字符串,绑定技术会将文本框中的变化(通过仲裁控制器)传递给绑定了的模型对象中合适的属性。编程者需要做的就是正确设计自己的模型对象,并通过Interface Builder在程序的视图、控制器、和模型对象之间建立绑定关系。 具体的公共控制器类的实例可以在Interface Builder的控件选盘上得到,因此是高度可重用的。它们提供一些服务,比如选择和占位符值的管理。这些对象执行下面这些特定的功能:NSObjectController 管理一个单独的模型对象。NSArrayController 管理一个模型对象数组,以及维护一个选择;还可以在数组中加入或删除模型对象。NSTreeController 使您可以在一个具有层次的树结构中添加、删除、和管理模型对象。NSUserDefaultsController 为预置(用户缺省值)系统提供一个便利的接口。 使用和限制 您通常可用将NSController对象用作仲裁控制器,因为这些对象的设计目的是在应用程序的视图对象和模型对象之间传递数据。在使用仲裁控制器时,您通常是从Interface Builder选盘中拖出对象,指定模型对象的属性键,并通过Interface Builder Info 窗口中的Bindings面板建立视图和模型对象之间的绑定关系。您也可以生成NSController或其子类的子类,以获得更具具体行为的子类。 几乎任何一对对象之间都可以建立绑定关系,只要它们遵循NSKeyValueCoding和NSKeyValueObserving这两个非正式协议。但是,我们推荐您通过仲裁控制器来建立绑定,以得到NSController及其子类为您提供的各种好处。 协调控制器通过下面的方式集中实现一个应用程序的通讯和控制逻辑: 维护指向模型和视图对象的插座变量(插座变量是指向其它被保持为实例变量的连接或引用)。 通过目标-动作机制响应用户在视图对象上的操作(参见"目标-动作"部分)。 作为委托对象,处理从框架对象发出的消息(参见"委托"部分)。 您通常可以在Interface Builder中建立上述的连接—插座变量、目标-动作、和委托,它将这些连接归档到应用程序的nib文件中。进一步阅读: 有关仲裁控制器、协调控制器、和与控制器有关的设计决定的讨论,请参见"模型-视图-控制器设计模式"部分。 备忘录模式这种模式在不破坏封装的情况下,捕捉和外部化对象的内部状态,使对象在之后可以回复到该状态。备忘录模式使关键对象的重要状态外部化,同时保持对象的内聚性。 归档归档将一个程序中的对象以及对象的属性(包括属性和关系)存储到档案上,使之可以保存到文件系统中,或者在不同的处理器和网络间传递。档案将程序的对象图保存为独立于架构的字节流,对象的标识和对象之间的关系都会被保留。由于对象的类型和它的数据一起被存储,从归档的字节流解码出来的对象会被正常实例化,实例化所用的类与原来编码的类相同。 使用和限制 通常情况下,您希望将程序中需要保存状态的对象归档。模型对象几乎总是属于这个范畴。您通过编码将对象写入到档案中,而通过解码将对象从档案中读取出来。通过NSCoder对象可以执行编解码操作,在编解码过程中最好使用键化的归档技术(需要调用NSKeyedArchiver和NSKeyedUnarchiver类的方法)。被编解码的对象必须遵循NSCoding协议;该协议的方法在归档过程中会被调用。进一步阅读: 有关归档的进一步信息。 属性列表的序列化属性列表是一个简单的、具有一定结构的对象图序列,它仅使用下面这些类的对象:NSDictionary、NSArray、NSString、NSData、NSDate、和NSNumber。这些对象通常也被称为属性列表对象。Cocoa中有几个框架类提供了序列化属性列表对象,以及定义录写对象内容及其层次关系的特殊数据流格式的方法。NSPropertyListSerialization类就提供了将属性列表对象序列化为XML或其它优化的二进制格式的类方法。 使用和限制 如果对象图中包含的是简单对象,则在捕捉和外部化对象及其状态时,属性列表序列化是一种灵活的、可移植的、而又非常适当的工具。然而,这种形式的序列化有它的限制,它不保留对象的全部类标识,而只保留一些一般的类型(数组、字典、字符串、等等)。这样,从属性列表恢复出来的对象可能和原来的类不同,特别是当对象的可变性可能发生变化时,这就会带来问题。属性列表序列化也不跟踪在同一对象中被多次引用的对象,这可能导致反向序列化时产生多个实例,而在原来的对象图中却只有一个实例。进一步阅读: 有关属性列表序列化的更多信息。 Core DataCore Data是一个管理对象图,并使其留存的框架和架构。正是第二种能力—对象的留存能力—使Core Data成为备忘录模式的一种适配形式。 在Core Data架构中,中心的对象称为被管理对象上下文,负责管理应用程序对象图中的模型对象。在被管理对象上下文下面是该对象图的持久栈,也就是一个框架对象的集合,负责协调模型对象和外部数据存储,比如XML文件或关系数据库。持久栈对象负责建立存储中的数据和被管理对象上下文中的对象之间的映射关系,在

2. cocoa和foundation框架的区别

Cocoa是苹果公司为Mac OS X所创建的原生面向对象的编程环境,是Mac OS X上五大API之一(其它四个是Carbon、POSIX、X11和Java)。
Cocoa 应用程序一般在苹果公司的开发工具Xcode(前身为Project Builder)和Interface Builder上用 Objective-C写成。不过,通过Java bridge、PasCocoa、PyObjC、CamelBones以及RubyCocoa等桥接技术,Java、Clozure CL、LispWorks、Object Pascal、Python、Perl、Ruby等其它工具或者语言也可以用来开发 Cocoa 应用。也有一些其它语言的Cocoa实现无须桥接,比如苹果公司开发的MacRuby和类似Lisp的Nu语言。不使用Xcode和Interface Builder,仅仅通过文本编辑器、GCC和GNU make工具也可以用Objective-C语言开发Cocoa应用。
对最终用户来说,使用Cocoa编程环境开发的应用程序即为Cocoa 应用。这类应用有独特的外观,因为Cocoa编程环境让程序在多方面自动遵循苹果公司的人机界面守则。
Cocoa包含两个主要的Objective-C对象库,称为“框架”。框架的功能类似于动态库,即可以在运行时动态的载入应用程序的地址空间,但框架作为一个捆绑 (计算机)而非独立文件,其中除了可执行代码外,也包含了资源,头文件和文档。

“Foundation 工具包”,或简称为“Foundation”,首先出现在OpenStep中。在Mac OS X中,它是基于Core Foundation的。作为通用的面向对象的函数库,Foundation提供了字符串,数值的管理,容器及其枚举,分布式计算,事件循环,以及一些其它的与图形用户界面没有直接关系的功能。其中用于类和常数的“NS”前缀来自于Cocoa的来源,NeXTSTEP。它可以在Mac OS X和iOS中使用。 “应用程序工具包”,或称AppKit(Application Kit)是直接衍生自NeXTSTEP的AppKit的。它包含了程序与图形用户界面交互所需的代码。它是基于Foundation建立的,也使用“NS”前缀。它只能在Mac OS X中使用。 “用户界面工具包”,或称UIKit(User Interface Kit),是用于iOS的图形用户界面工具包。与AppKit不同,它使用“UI”的前缀。

Cocoa 构架的一个关键部分是其多样的视图模型。总体而言,它是基于由Quartz提供的PDF绘制模型的,该特性允许使用PostScript绘制自定义图形内容,同时也自动的支持了打印机以及类似设备。由于Cocoa框架管理了全部的绘图操作,例如裁剪,滚动,缩放等,程序员可以不再重复实现基础的功能,而可以集中于提供程序的关键功能上。

3. s/mime中的p7m怎么解析头部的

3gp video/3gpp
aab application/x-authoware-bin
aam application/x-authoware-map
aas application/x-authoware-seg
ai application/postscript
aif audio/x-aiff
aifc audio/x-aiff
aiff audio/x-aiff
als audio/X-Alpha5
amc application/x-mpeg
ani application/octet-stream
asc text/plain
asd application/astound
asf video/x-ms-asf
asn application/astound
asp application/x-asap
asx video/x-ms-asf
au audio/basic
avb application/octet-stream
avi video/x-msvideo
awb audio/amr-wb
bcpio application/x-bcpio
bin application/octet-stream
bld application/bld
bld2 application/bld2
bmp application/x-MS-bmp
bpk application/octet-stream
bz2 application/x-bzip2
cal image/x-cals
ccn application/x-cnc
cco application/x-cocoa
cdf application/x-netcdf
cgi magnus-internal/cgi
chat application/x-chat
class application/octet-stream
clp application/x-msclip
cmx application/x-cmx
co application/x-cult3d-object
cod image/cis-cod
cpio application/x-cpio
cpt application/mac-compactpro
crd application/x-mscardfile
csh application/x-csh
csm chemical/x-csml
csml chemical/x-csml
css text/css
cur application/octet-stream
dcm x-lml/x-evm
dcr application/x-director
dcx image/x-dcx
dhtml text/html
dir application/x-director
dll application/octet-stream
dmg application/octet-stream
dms application/octet-stream
doc application/msword
dot application/x-dot
dvi application/x-dvi
dwf drawing/x-dwf
dwg application/x-autocad
dxf application/x-autocad
dxr application/x-director
ebk application/x-expandedbook
emb chemical/x-embl-dl-nucleotide
embl chemical/x-embl-dl-nucleotide
eps application/postscript
epub application/epub+zip
eri image/x-eri
es audio/echospeech
esl audio/echospeech
etc application/x-earthtime
etx text/x-setext
evm x-lml/x-evm
evy application/x-envoy
exe application/octet-stream
fh4 image/x-freehand
fh5 image/x-freehand
fhc image/x-freehand
fif image/fif
fm application/x-maker
fpx image/x-fpx
fvi video/isivideo
gau chemical/x-gaussian-input
gca application/x-gca-compressed
gdb x-lml/x-gdb
gif image/gif
gps application/x-gps
gtar application/x-gtar
gz application/x-gzip
hdf application/x-hdf
hdm text/x-hdml
hdml text/x-hdml
hlp application/winhlp
hqx application/mac-binhex40
htm text/html
html text/html
hts text/html
ice x-conference/x-cooltalk
ico application/octet-stream
ief image/ief
ifm image/gif
ifs image/ifs
imy audio/melody
ins application/x-NET-Install
ips application/x-ipscript
ipx application/x-ipix
it audio/x-mod
itz audio/x-mod
ivr i-world/i-vrml
j2k image/j2k
jad text/vnd.sun.j2me.app-descriptor
jam application/x-jam
jar application/java-archive
jnlp application/x-java-jnlp-file
jpe image/jpeg
jpeg image/jpeg
jpg image/jpeg
jpz image/jpeg
js application/x-javascript
jwc application/jwc
kjx application/x-kjx
lak x-lml/x-lak
latex application/x-latex
lcc application/fastman
lcl application/x-digitalloca
lcr application/x-digitalloca
lgh application/lgh
lha application/octet-stream
lml x-lml/x-lml
lmlpack x-lml/x-lmlpack
lsf video/x-ms-asf
lsx video/x-ms-asf
lzh application/x-lzh
m13 application/x-msmediaview
m14 application/x-msmediaview
m15 audio/x-mod
m3u audio/x-mpegurl
m3url audio/x-mpegurl
ma1 audio/ma1
ma2 audio/ma2
ma3 audio/ma3
ma5 audio/ma5
man application/x-troff-man
map magnus-internal/imagemap
mbd application/mbedlet
mct application/x-mascot
mdb application/x-msaccess
mdz audio/x-mod
me application/x-troff-me
mel text/x-vmel
mi application/x-mif
mid audio/midi
midi audio/midi
mif application/x-mif
mil image/x-cals
mio audio/x-mio
mmf application/x-skt-lbs
mng video/x-mng
mny application/x-msmoney
moc application/x-mocha
mocha application/x-mocha
mod audio/x-mod
mof application/x-yumekara
mol chemical/x-mdl-molfile
mop chemical/x-mopac-input
mov video/quicktime
movie video/x-sgi-movie
mp2 audio/x-mpeg
mp3 audio/x-mpeg
mp4 video/mp4
mpc application/vnd.mpohun.certificate
mpe video/mpeg
mpeg video/mpeg
mpg video/mpeg
mpg4 video/mp4
mpga audio/mpeg
mpn application/vnd.mophun.application
mpp application/vnd.ms-project
mps application/x-mapserver
mrl text/x-mrml
mrm application/x-mrm
ms application/x-troff-ms
mts application/metastream
mtx application/metastream
mtz application/metastream
mzv application/metastream
nar application/zip
nbmp image/nbmp
nc application/x-netcdf
ndb x-lml/x-ndb
ndwn application/ndwn
nif application/x-nif
nmz application/x-scream
nokia-op-logo image/vnd.nok-oplogo-color
npx application/x-netfpx
nsnd audio/nsnd
nva application/x-neva1
oda application/oda
oom application/x-AtlasMate-Plugin
pac audio/x-pac
pae audio/x-epac
pan application/x-pan
pbm image/x-portable-bitmap
pcx image/x-pcx
pda image/x-pda
pdb chemical/x-pdb
pdf application/pdf
pfr application/font-tdpfr
pgm image/x-portable-graymap
pict image/x-pict
pm application/x-perl
pmd application/x-pmd
png image/png
pnm image/x-portable-anymap
pnz image/png
pot application/vnd.ms-powerpoint
ppm image/x-portable-pixmap
pps application/vnd.ms-powerpoint
ppt application/vnd.ms-powerpoint
pqf application/x-cprplayer
pqi application/cprplayer
prc application/x-prc
proxy application/x-ns-proxy-autoconfig
ps application/postscript
ptlk application/listenup
pub application/x-mspublisher
pvx video/x-pv-pvx
qcp audio/vnd.qcelp
qt video/quicktime
qti image/x-quicktime
qtif image/x-quicktime
r3t text/vnd.rn-realtext3d
ra audio/x-pn-realaudio
ram audio/x-pn-realaudio
rar application/octet-stream
ras image/x-cmu-raster
rdf application/rdf+xml
rf image/vnd.rn-realflash
rgb image/x-rgb
rlf application/x-richlink
rm audio/x-pn-realaudio
rmf audio/x-rmf
rmm audio/x-pn-realaudio
rmvb audio/x-pn-realaudio
rnx application/vnd.rn-realplayer
roff application/x-troff
rp image/vnd.rn-realpix
rpm audio/x-pn-realaudio-plugin
rt text/vnd.rn-realtext
rte x-lml/x-gps
rtf application/rtf
rtg application/metastream
rtx text/richtext
rv video/vnd.rn-realvideo
rwc application/x-rogerwilco
s3m audio/x-mod
s3z audio/x-mod
sca application/x-supercard
scd application/x-msschele
sdf application/e-score
sea application/x-stuffit
sgm text/x-sgml
sgml text/x-sgml
sh application/x-sh
shar application/x-shar
shtml magnus-internal/parsed-html
shw application/presentations
si6 image/si6
si7 image/vnd.stiwap.sis
si9 image/vnd.lgtwap.sis
sis application/vnd.symbian.install
sit application/x-stuffit
skd application/x-Koan
skm application/x-Koan
skp application/x-Koan
skt application/x-Koan
slc application/x-salsa
smd audio/x-smd
smi application/smil
smil application/smil
smp application/studiom
smz audio/x-smd
snd audio/basic
spc text/x-speech
spl application/futuresplash
spr application/x-sprite
sprite application/x-sprite
sdp application/sdp
spt application/x-spt
src application/x-wais-source
stk application/hyperstudio
stm audio/x-mod
sv4cpio application/x-sv4cpio
sv4crc application/x-sv4crc
svf image/vnd
svg image/svg-xml
svh image/svh
svr x-world/x-svr
swf application/x-shockwave-flash
swfl application/x-shockwave-flash
t application/x-troff
tad application/octet-stream
talk text/x-speech
tar application/x-tar
taz application/x-tar
tbp application/x-timbuktu
tbt application/x-timbuktu
tcl application/x-tcl
tex application/x-tex
texi application/x-texinfo
texinfo application/x-texinfo
tgz application/x-tar
thm application/vnd.eri.thm
tif image/tiff
tiff image/tiff
tki application/x-tkined
tkined application/x-tkined
toc application/toc
toy image/toy
tr application/x-troff
trk x-lml/x-gps
trm application/x-msterminal
tsi audio/tsplayer
tsp application/dsptype
tsv text/tab-separated-values
ttf application/octet-stream
ttz application/t-time
txt text/plain
ult audio/x-mod
ustar application/x-ustar
uu application/x-uuencode
uue application/x-uuencode
vcd application/x-cdlink
vcf text/x-vcard
vdo video/vdo
vib audio/vib
viv video/vivo
vivo video/vivo
vmd application/vocaltec-media-desc
vmf application/vocaltec-media-file
vmi application/x-dreamcast-vms-info
vms application/x-dreamcast-vms
vox audio/voxware
vqe audio/x-twinvq-plugin
vqf audio/x-twinvq
vql audio/x-twinvq
vre x-world/x-vream
vrml x-world/x-vrml
vrt x-world/x-vrt
vrw x-world/x-vream
vts workbook/formulaone
wav audio/x-wav
wax audio/x-ms-wax
wbmp image/vnd.wap.wbmp
web application/vnd.xara
wi image/wavelet
wis application/x-InstallShield
wm video/x-ms-wm
wma audio/x-ms-wma
wmd application/x-ms-wmd
wmf application/x-msmetafile
wml text/vnd.wap.wml
wmlc application/vnd.wap.wmlc
wmls text/vnd.wap.wmlscript
wmlsc application/vnd.wap.wmlscriptc
wmlscript text/vnd.wap.wmlscript
wmv video/x-ms-wmv
wmx video/x-ms-wmx
wmz application/x-ms-wmz
wpng image/x-up-wpng
wpt x-lml/x-gps
wri application/x-mswrite
wrl x-world/x-vrml
wrz x-world/x-vrml
ws text/vnd.wap.wmlscript
wsc application/vnd.wap.wmlscriptc
wv video/wavelet
wvx video/x-ms-wvx
wxl application/x-wxl
x-gzip application/x-gzip
xar application/vnd.xara
xbm image/x-xbitmap
xdm application/x-xdma
xdma application/x-xdma
xdw application/vnd.fujixerox.docuworks
xht application/xhtml+xml
xhtm application/xhtml+xml
xhtml application/xhtml+xml
xla application/vnd.ms-excel
xlc application/vnd.ms-excel
xll application/x-excel
xlm application/vnd.ms-excel
xls application/vnd.ms-excel
xlt application/vnd.ms-excel
xlw application/vnd.ms-excel
xm audio/x-mod
xml text/xml
xmz audio/x-mod
xpi application/x-xpinstall
xpm image/x-xpixmap
xsit text/xml
xsl text/xml
xul text/xul
xwd image/x-xwindowmp
xyz chemical/x-pdb
yz1 application/x-yz1
z application/x-compress
zac application/x-zaurus-zac
zip application/zip

4. Cocoa如何应用设计模式

Cocoa经常把自己与众不同的工作机制建立在模式上,它的设计受到诸如语言能力或现有架构这样因素的影响。本部分包含设计模式:可重用的面向对象软件的元素一书中编目的大多数设计模式的介绍。每个设计模式都有一个总结性的描述,以及该模式的Cocoa实现的讨论。文中列出的都是Cocoa实现的模式,每个模式的讨论都发生在特定的Cocoa环境中。我们推荐您熟悉这些模式,您会发现这些模式在Cocoa软件开发中非常有用。Cocoa中设计模式的实现有不同的形式。下面部分中描述的一些设计—比如协议和范畴—是Objective-C语言的特性;在另外一些场合中,“模式的实例”被实现为一个类或一组相关的类(比如类簇和单件类);还有一些场合下,模式表现为一个大的框架结构,比如响应者链模式。对于某些基于模式的机制,您几乎可以“免费”使用;而另外一些机制则要求您做一些工作。即使对于Cocoa没有实现的模式,我们也鼓励您在条件许可的情况下自行实现,比如在扩展类的行为时,对象合成(装饰模式)技术通常就比生成子类更好。有两个设计模式没有在下面的内容中进行讨论,即模型-视图-控制器(MVC)模式和对象建模。MVC是一种复合或聚合模式,就是说它基于几种不同类型的模式。对象建模在四人组的分类目录中没有对应类别,它源自关系数据库领域。然而,MVC和对象建模在Cocoa中可能是最重要和最普遍的设计模式或用语,而且它们在很大程度上是相关的。它们在几个技术的设计中发挥关键的作用,包括绑定、撤消管理、脚本控制、和文档架构。要了解更多有关这些模式的信息,请参见"模型-视图-控制器设计模式"和"对象建模"部分。本部分包含如下主要内容:抽象工厂模式适配器模式责任链模式命令模式合成模式装饰模式表观模式跌代器模式仲裁者模式备忘录模式观察者模式代理模式单件模式模板方法模式抽象工厂模式提供一个接口,用于创建与某些对象相关或依赖于某些对象的类家族,而又不需要指定它们的具体类。通过这种模式可以去除客户代码和来自工厂的具体对象细节之间的耦合关系。类簇类簇是一种把一个公共的抽象超类下的一些私有的具体子类组合在一起的架构。抽象超类负责声明创建私有子类实例的方法,会根据被调用方法的不同分配恰当的具体子类,每个返回的对象都可能属于不同的私有子类。Cocoa将类簇限制在数据存储可能因环境而变的对象生成上。Foundation框架为NSString、NSData、NSDictionary、NSSet、和NSArray对象定义了类簇。公共超类包括上述的不可变类和与其相互补充的可变类NSMutableString、NSMutableData、NSMutableDictionary、NSMutableSet、和NSMutableArray。使用和限制当您希望创建类簇代表的类型的可变或不可变对象时,可以使用类簇中的某个公共类来实现。使用类簇是在简洁性和扩展性之间进行折衷。类簇可以简化类接口,因此使其更易于学习和使用,但是创建类簇抽象类的定制子类则会变得更加困难。进一步阅读: "类簇" 部分提供有关Cocoa类簇的更多信息。 适配器模式将一个类接口转化为客户代码需要的另一个接口。适配器使原本由于兼容性而不能协同工作的类可以工作在一起,消除了客户代码和目标对象的类之间的耦合性。协议协议是一个编程语言级别(Objective-C)的特性,它使定义适配器模式的实例成为可能(在 Java中的“接口”和“协议”是同义的)。如果您希望一个客户对象和另一个对象进行交流,但由于它们的接口不兼容而导致困难,您就可以定义一个协议,它本质上是一系列和类不相关联的方法声明。这样,其它对象的类就可以正式采纳该协议,并通过实现协议中的全部方法来“遵循”该协议。结果,客户对象就可以通过协议接口向其它对象发送消息。协议是一组独立于类层次的方法声明,这样就有可能象类的继承那样,根据对象遵循的协议对其进行分组。您可以通过NSObject的conformsToProtocol:方法来确认一个对象的协议关系。除了正式协议之外,Cocoa还有一个非正式协议的概念。这种类型的协议是NSObject类中的一个范畴(category),这样就使所有的对象都成为范畴方法的潜在实现者(参见"范畴"部分)。非正式协议的方法可以选择性地实现。非正式协议是委托机制实现的一部分(参见"委托"部分。请注意,协议的设计和适配器模式并不完全匹配。但它是使接口不兼容的类在得以协同工作的手段。使用和限制协议主要用于声明层次结构上不相关的类为了互相通讯而需要遵循的接口。但是,您也可以将协议用于声明对象的接口,而隐藏相应的类。Cocoa框架包括很多正式协议,这些协议使定制子类可以和框架进行特定目的的通讯。举例来说,Foundation框架中包含NSObject、NSCopying、和NSCoding协议,都非常重要。Application Kit中的协议包括NSDraggingInfo、NSTextInput、和NSChangeSpelling。正式协议要求遵循者实现协议声明的所有方法。它们也是零碎的,一旦您定义一个协议并将它提供给其它类,将来对协议的修改会使那些类不能工作。进一步阅读:有关正式协议的更多信息请参见Objective-C编程语言文档中“扩展类”部分的讨论。 责任链模式通过为多个对象提供处理请求的机会,避免请求的发送者和接收者产生耦合。将接收对象串成链,并将请求沿着接收者链进行传递,直到某个对象对其进行处理。对象或者处理该请求,或者将它传递给链中的下一个对象。响应者链Application Kit框架中包含一个称为响应者链的架构。该链由一系列响应者对象(就是从NSResponder继承下来的对象)组成,事件(比如鼠标点击)或者动作消息沿着链进行传递并(通常情况下)最终被处理。如果给定的响应者对象不处理特定的消息,就将消息传递给链中的下一个响应者。响应者在链中的顺序通常由视图的层次结构来决定,从层次较低的响应者对象向层次较高的对象传递,顶点是管理视图层次结构的窗口对象,窗口对象的委托对象,或者全局的应用程序对象。事件和动作消息在响应者链中的确切传递路径是不尽相同的。一个应用程序拥有的响应者链可能和它拥有的窗口(甚至是局部层次结构中的视图对象)一样多,但每次只能有一个响应者链是活动的—也就是与当前活动窗口相关联的那个响应链。还有一个与响应者链相类似的链,用于应用程序的错误处理。视图层次的设计应用的是合成模式(参见"合成模式"部分),它和响应者链密切相关。动作消息—源自控件对象的消息—基于目标-动作机制,是命令模式(参见"命令模式"部分)的一个实例。使用和限制当您通过Interface Builder或以编程的方式为程序构造用户界面时,可以“免费”得到一个或多个响应者链。响应者链和视图层次结构一起出现,当您使一个视图对象成为窗口内容视图的子视图时,视图层次结构就自动生成了。如果您将一个定制视图加入到一个视图层次结构中,它就变成响应者链的一部分;如果您实现了恰当的NSResponder方法,就可以接收和处理事件及动作消息。定制对象是窗口对象或全局应用程序对象NSApp的委托对象,也可以接收和处理那些消息。您也可以用编程的方式将定制的响应者对象注入到响应者链中,以及通过编程操作响应者在链中的顺序。进一步阅读: 处理事件和动作消息及程序错误的的响应者链在Cocoa事件处理指南和Cocoa的错误处理编程指南文档中进行描述。本文档在"合成模式"部分对视图层次结构有总结性的介绍,在"核心应用程序架构"部分有更全面的描述。 命令模式这种模式将请求封装为对象,使您可以用不同的请求来对客户代码进行参数化;对请求进行排队和记录,并支持可撤消(undoable)的操作。请求对象将一或多个动作绑定在特定的接收者上。命令模式将发出请求的对象和接收及执行请求的对象区分开来。调用对象NSInvocation类的实例用于封装Objective-C消息。一个调用对象中含有一个目标对象、一个方法选择器、以及方法参数。您可以动态地改变调用对象中消息的目标及其参数,一旦消息被执行,您就可以从该对象得到返回值。通过一个调用对象可以多次调用目标或参数不同的消息。创建NSInvocation对象需要使用NSMethodSignature对象,该对象负责封装与方法参数和返回值有关系的信息。NSMethodSignature对象的创建又需要用到一个方法选择器。NSInvocation的实现还用到Objective-C运行环境的一些函数。使用和限制NSInvocation对象是分布式、撤消管理、消息传递、和定时器对象编程接口的一部分。在需要去除消息发送对象和接收对象之间的耦合关系的类似场合下,您也可以使用。分布式对象是一种进程间通讯技术,关于这个主题的更多信息请参见"代理模式"部分。进一步阅读:调用对象的细节请阅读NSInvocation的类参考文档。您也可以从下面的文档中获取相关技术的信息:Objective-C编程语言文档中的分布式对象、撤消架构、定时器以及之后的部分。 目标-动作目标-动作机制使控件对象—也就是象按键或文本输入框这样的对象—可以将消息发送给另一个可以对消息进行解释并将它处理为具体应用程序指令的对象。接收对象,或者说是目标,通常是一个定制的控制器对象。消息—也被称为动作消息—由一个选择器来确定,选择器是一个方法的唯一运行时标识。典型情况下,控件拥有的单元对象会对目标和动作进行封装,以便在用户点击或激活控件时发送消息(菜单项也封装了目标和动作,以便在用户选择时发送动作消息)。目标-动作机制之所以能够基于选择器(而不是方法签名),是因为Cocoa规定动作方法的签名和选择器名称总是一样的。使用和限制当您用Interface Builder构建程序的用户界面时,可以对控件的动作和目标进行设置。您因此可以让控件具有定制的行为,而又不必为控件本身书写任何的代码。动作选择器和目标连接被归档在nib文件中,并在nib文件被解档时复活。您也可以通过向控件或它的单元对象发送setTarget:和setAction:消息来动态地改变目标和动作。目标-动作机制经常用于通知定制控制器对象将数据从用户界面传递给模型对象,或者将模型对象的数据显示出来。Cocoa绑定技术则可以避免这种用法,有关这种技术的更多信息请参见Cocoa绑定编程主题文档。Application Kit中的控件和单元并不保持它们的目标。相反,它们维护一个对目标的弱引用。进一步的信息请参见"委托、观察者、和目标的所有权" 部分。进一步阅读:更多信息请参见"目标-动作机制"部分。 合成模式这种模式将互相关联的对象合成为树结构,以表现部分-全部的层次结构。它使客户代码可以统一地处理单独的对象和多个对象的合成结果。合成对象是模型-视图-控制器聚集模式的一部分。视图层次结构一个窗口包含的视图对象(NSView对象)在内部构成了一个视图层次结构。层次结构的根是窗口对象(NSWindow对象)和它的内容视图。内容视图就是填充到窗口内容方框中的透明视图,添加到内容视图中的视图都是它的子视图,而这些子视图又会成为下一级视图的父视图。一个视图有一个(且只有一个)父视图,可以有零或多个子视图。在视觉上,您可以将这个结构理解为包含关系:父视图包含它的子视图。图4-2显示视图层次的结构以及在视觉上的关系。 图4-2 视图层次的结构及其在视觉上的关系 视图层次是一个结构方面的架构,在图形描画和事件处理上都扮演一定的角色。一个视图有两个影响图形操作位置的边界框,即边框(frame)和边界(bound)。边框是外部边界,表示视图在其父视图坐标系统中的位置,它负责定义视图的尺寸,并根据视图边界对图形进行裁减。边界则是内部的边界框,负责定义视图对象自身描画表面的内部坐标系统。当窗口系统要求一个窗口做好显示准备时,父视图会在其子视图之前被要求进行渲染。当您向一个视图发送消息时—比如发送一个重画视图的消息—该消息就会被传播到子视图。因此,您可以将视图层次结构中的一个分支当成一个统一的视图来处理。响应者链也把视图层次用于处理事件和动作消息。请参见责任链模式部分中("责任链模式")关于响应者链的总结描述。使用和限制无论以编程的方式,还是通过Interface Builder,当您将一个视图加入到另一个视图中时,都需要创建或修改视图层次结构。Application Kit框架自动处理与视图层次结构相关联的所有关系。进一步阅读:如果需要了解更多视图层次结构的信息,请阅读本文档的"视图层次结构"部分。Cocoa描画指南文档中也对视图层次结构进行讨论。 装饰模式这种模式动态地将额外的责任附加到一个对象上。在进行功能扩展时,装饰是子类化之外的一种灵活的备选方法。和子类化一样,采纳装饰模式可以加入新的行为,而又不必修改已有的代码。装饰将需要扩展的类的对象进行包装,实现与该对象相同的接口,并在将任务传递给被包装对象之前或之后加入自己的行为。装饰模式表达了这样的设计原则:类应该接纳扩展,但避免修改。一般性的说明装饰是用于对象合成的模式。在您自己的代码中应该鼓励使用对象的合成(参见"什么时候需要生成子类"部分)。然而,Cocoa自己提供了一些基于这种模式的类和机制(在下面的部分进行讨论)。在这些实现中,扩展对象并不完全复制它所包装的对象的接口,虽然具体实现中可以使用不同的技术来进行接口共享。Cocoa在实现某些类时用到了装饰模式,包括NSAttributedString、NSScrollView、和NSTableView。后面两个类是复合视图的例子,它们将其它一些视图类的对象组合在一起,然后协调它们之间的交互。委托委托是在宿主对象中嵌入一个指向另一对象(也就是委托对象)的弱引用(一个未保持的插座变量),并不时地向该委托对象发送消息,使其对有关的任务进行输入的机制。宿主对象一般是一个“复活”的框架对象(比如一个NSWindow或NSXMLParser对象),它寻求完成某项工作,但又只能以一般的方式来进行。委托几乎总是一个定制类的实例,它负责配合宿主对象,在有关任务的特定点(参见图4-3)上提供与具体程序有关的行为。这样,委托机制使我们可以对另一个对象的行为进行修改或者扩展,而不需要生成子类。 图4-3 框架对象向它的委托对象发送消息 简而言之,委托就是一个对象将任务委托给另一个对象,它是面向对象编程的常用技术。然而,Cocoa以独特的方式实现委托机制。宿主类用非正式协议—即NSObject中的范畴—来定义委托对象可能选择实现的接口。委托对象不必象采纳正式协议那样实现所有的协议方法。在向委托对象发送消息之前,宿主对象可以首先确定相应的方法是否实现(通过respondsToSelector:消息),以避免运行时例外。有关正式协议和非正式协议的更多信息,请参见"协议"部分。Cocoa框架中的一些类也向它们的数据源发送消息。数据源在各个方面都和委托一样,除了它的目的是为宿主对象提供数据,以传递给浏览器、表视图、或者类似的用户界面视图。和委托不同的是,数据源还必须实现某些协议方法。委托不是装饰模式的严格实现。宿主(委托)对象并没有包装它希望扩展的类的实例。相反,委托是对委托框架类的行为进行特殊化。除了框架类声明的委托方法之外,它们也没有公共的接口。Cocoa中的委托也是模板方法模式("模板方法模式")的一部分。使用和限制委托是Cocoa框架中的一种常用的设计。Application Kit框架中的很多类都向它们的委托发送消息,包括NSApplication、NSWindow、和NSView的几个子类。Foundation框架中的一些类,比如NSXMLParser和NSStream,也维护自己的委托。您应该总是使用类的委托机制,而不是生成类的子类,除非委托方法不能完成您的目标。虽然您可以动态地改变委托,但是同时只能有一个对象可以成为委托。因此,如果您希望当特定的程序事件发生时,有多个对象可以同时得到通知,则不能使用委托。在这种情况下您可以使用通告机制。如果委托对象实现了一或多个框架类声明的通告方法,就会自动接收到其委托框架对象的通告。请参考观察者模式( "观察者模式")中有关通告的讨论。Application Kit框架中的向外委托任务的对象并不保持它们的委托或数据源,而是维护一个弱引用,更多信息请参见"委托、观察者、和目标的所有权"部分。进一步阅读:关于委托的进一步信息请参见"委托和数据源"部分。 范畴范畴是Objective-C语言的一个特性,用于为一个类增加方法(接口和实现),而不必生成子类。类原始声明的方法和通过范畴添加的方法在运行时没有区别—在您的程序的作用范围内。范畴中的方法成为类类型的一部分,并被所有的子类继承。和委托一样,范畴并没有严格适配装饰模式。它实现了该模式的目的,但采用不同的实现方式。范畴加入的行为是在编译时生成的,而不是动态得到的。而且,范畴并没有封装被扩展的类的实例。使用和限制Cocoa框架中定义了很多范畴,大多数都是非正式协议(在"协议"部分中进行总结)。它们通常使用范畴来对相关的方法进行分组。您也可以在代码中实现范畴,以在不生成子类的情况下对类进行扩展,或者对相关的方法进行分组。但是您需要注意如下两点:您不能为类添加实例变量。如果您对现有的方法进行重载,则应用程序可能产生预料之外的行为。进一步阅读: 更多有关范畴的信息请参见Objective-C编程语言一文中的“类的扩展”部分。 表观模式这种模式为子系统中的一组接口提供统一的接口。表观模式定义一个更高级别的接口,通过减少复杂度和隐藏子系统之间的通讯和依赖性,使子系统更加易于使用。NSImageNSImage类为装载和使用基于位图(比如JPEG、PNG、或者TIFF格式)或向量(EPS或PDF格式)的图像提供统一的接口。NSImage可以为同一个图像保持多个表示,不同的表示对应于不同类型的NSImageRep对象。NSImage可以自动选择适合于特定数据类型和显示设备的表示。同时,它隐藏了图像操作和选择的细节,使客户代码可以交替使用很多不同的表示。使用和限制由于NSImage支持几种不同的图像表示,因此某些属性可能不能适用。举例来说,您可能不能取得图像中一个像素的颜色,如果潜在的图像表示使基于向量且与设备无关的话。请注意:NSImage和图像表示的讨论请参见Cocoa描画指南。 迭代器模式这种模式提供一种顺序访问聚合对象(也就是一个集合)中的元素,而又不必暴露潜在表示的方法。迭代器模式将访问和遍历集合元素的责任从集合对象转移到迭代器对象。迭代器定义一个访问集合元素的接口,并对当前元素进行跟踪。不同的迭代器可以执行不同的遍历策略。NSEnumeratorFoundation框架中的NSEnumerator类实现了迭代器模式。NSEnumerator抽象类的私有具体子类返回的枚举器对象可以顺序遍历不同类型的集合—数组、集合、字典(值和键)—并将集合中的对象返回给客户代码。NSDirectoryEnumerator是一个不紧密相关的类,它的实例可以递归地枚举文件系统中目录的内容。使用和限制象NSArray、NSSet、和NSDictionary这样的集合类都包含相应的方法,可以返回与集合的类型相适用的枚举器。所有的枚举器的工作方式都一样。您可以在循环中向枚举器发送nextObject消息,如果该消息返回nil,而不是集合中的下一个对象,则退出循环。仲裁者模式这种模式定义的对象用于封装一组对象的交互机制。仲裁者模式可以避免对象之间显式的互相引用,使对象之间的耦合变得宽松,也使您可以独立地改变它们的交互方式。这些对象也因此可以更具重用性。仲裁者对象集中了系统中的对象之间的复杂通讯和控制逻辑。这些对象在状态发生改变时会告诉仲裁者对象,反过来,也对仲裁者对象的请求进行响应。控制器类模型-视图-控制器设计模式为一个面向对象的系统(比如一个应用程序)中的对象分配不同的角色。它们可以是模型对象,包含应用程序的数据及对那些数据进行操作;可以是视图对象,负责表示数据及响应用户动作;也可以是控制器对象,负责协调模型和视图对象。控制器对象适合于仲裁者模式。在Cocoa中,控制器对象一般有两个类型:仲裁控制器或者协调控制器。仲裁控制器负责仲裁应用程序中视图对象和模型对象之间的数据流。仲裁控制器通常是NSController对象。协调控制器则负责实现应用程序的集中化通讯和控制逻辑,作为框架对象的委托和动作消息的目标。它们通常是NSWindowController对象或定制NSObject子类的实例。由于协调控制器高度专用于特定的程序,因此不考虑重用。Application Kit框架中的NSController抽象类和它的具体子类是Cocoa绑定技术的一部分,该技术可以自动同步模型对象包含的数据和视图对象中显示及编辑的数据。举例来说,如果用户在一个文本框中编辑一个字符串,绑定技术会将文本框中的变化(通过仲裁控制器)传递给绑定了的模型对象中合适的属性。编程者需要做的就是正确设计自己的模型对象,并通过Interface Builder在程序的视图、控制器、和模型对象之间建立绑定关系。具体的公共控制器类的实例可以在Interface Builder的控件选盘上得到,因此是高度可重用的。它们提供一些服务,比如选择和占位符值的管理。这些对象执行下面这些特定的功能:NSObjectController 管理一个单独的模型对象。NSArrayController 管理一个模型对象数组,以及维护一个选择;还可以在数组中加入或删除模型对象。NSTreeController 使您可以在一个具有层次的树结构中添加、删除、和管理模型对象。NSUserDefaultsController 为预置(用户缺省值)系统提供一个便利的接口。使用和限制您通常可用将NSController对象用作仲裁控制器,因为这些对象的设计目的是在应用程序的视图对象和模型对象之间传递数据。在使用仲裁控制器时,您通常是从Interface Builder选盘中拖出对象,指定模型对象的属性键,并通过Interface Builder Info 窗口中的Bindings面板建立视图和模型对象之间的绑定关系。您也可以生成NSController或其子类的子类,以获得更具具体行为的子类。几乎任何一对对象之间都可以建立绑定关系,只要它们遵循NSKeyValueCoding和NSKeyValueObserving这两个非正式协议。但是,我们推荐您通过仲裁控制器来建立绑定,以得到NSController及其子类为您提供的各种好处。协调控制器通过下面的方式集中实现一个应用程序的通讯和控制逻辑:维护指向模型和视图对象的插座变量(插座变量是指向其它被保持为实例变量的连接或引用)。通过目标-动作机制响应用户在视图对象上的操作(参见"目标-动作"部分)。作为委托对象,处理从框架对象发出的消息(参见"委托"部分)。您通常可以在Interface Builder中建立上述的连接—插座变量、目标-动作、和委托,它将这些连接归档到应用程序的nib文件中。进一步阅读: 有关仲裁控制器、协调控制器、和与控制器有关的设计决定的讨论,请参见"模型-视图-控制器设计模式"部分。 备忘录模式这种模式在不破坏封装的情况下,捕捉和外部化对象的内部状态,使对象在之后可以回复到该状态。备忘录模式使关键对象的重要状态外部化,同时保持对象的内聚性。归档归档将一个程序中的对象以及对象的属性(包括属性和关系)存储到档案上,使之可以保存到文件系统中,或者在不同的处理器和网络间传递。档案将程序的对象图保存为独立于架构的字节流,对象的标识和对象之间的关系都会被保留。由于对象的类型和它的数据一起被存储,从归档的字节流解码出来的对象会被正常实例化,实例化所用的类与原来编码的类相同。使用和限制通常情况下,您希望将程序中需要保存状态的对象归档。模型对象几乎总是属于这个范畴。您通过编码将对象写入到档案中,而通过解码将对象从档案中读取出来。通过NSCoder对象可以执行编解码操作,在编解码过程中最好使用键化的归档技术(需要调用NSKeyedArchiver和NSKeyedUnarchiver类的方法)。被编解码的对象必须遵循NSCoding协议;该协议的方法在归档过程中会被调用。进一步阅读: 有关归档的进一步信息。 属性列表的序列化属性列表是一个简单的、具有一定结构的对象图序列,它仅使用下面这些类的对象:NSDictionary、NSArray、NSString、NSData、NSDate、和NSNumber。这些对象通常也被称为属性列表对象。Cocoa中有几个框架类提供了序列化属性列表对象,以及定义录写对象内容及其层次关系的特殊数据流格式的方法。NSPropertyListSerialization类就提供了将属性列表对象序列化为XML或其它优化的二进制格式的类方法。使用和限制如果对象图中包含的是简单对象,则在捕捉和外部化对象及其状态时,属性列表序列化是一种灵活的、可移植的、而又非常适当的工具。然而,这种形式的序列化有它的限制,它不保留对象的全部类标识,而只保留一些一般的类型(数组、字典、字符串、等等)。这样,从属性列表恢复出来的对象可能和原来的类不同,特别是当对象的可变性可能发生变化时,这就会带来问题。属性列表序列化也不跟踪在同一对象中被多次引用的对象,这可能导致反向序列化时产生多个实例,而在原来的对象图中却只有一个实例。进一步阅读: 有关属性列表序列化的更多信息。 Core DataCore Data是一个管理对象图,并使其留存的框架和架构。正是第二种能力—对象的留存能力—使Core Data成为备忘录模式的一种适配形式。在Core Data架构中,中心的对象称为被管理对象上下文,负责管理应用程序对象图中的模型对象。在被管理对象上下文下面是该对象图的持久栈,也就是一个框架对象的集合,负责协调模型对象和外部数据存储,比如XML文件或关系数据库。持久栈对象负责建立存储中的数据和被管理对象上下文中的对象之间的映射关系,在有多个数据存储的时候,持久栈对象将这些存储表现为被管理对象上下文中的一个聚合存储

5. cocoa是什么意思

Cocoa是苹果公司为Mac OS X所创建的原生面向对象的API,是Mac OS X上五大API之一(其它四个是Carbon、POSIX、X11和Java)。

苹果的面向对象开发框架,用来生成 Mac OS X 的应用程序。主要的开发语言为 Objective-c, 一个c 的超集。 Cocoa 开始于1989年9月上市的NeXTSTEP 1.0,当时没有Foundation框架,只有动态运行库。

发展历史

Cocoa 是从1980年代由 NeXT 开发的编程环境NeXTSTEP 和 OPENSTEP 演变而来,这点可由其类别之名皆以 NS 前缀(代表NeXTSTEP)看出端倪。

苹果电脑公司在1996年12月收购了NeXT。开发 NeXTSTEP 和 OPENSTEP 的大量工作都转化到了 Mac OS X 中,最显而易见的部分当属 Cocoa。

但差异也存在。例如,NeXTSTEP 和 OPENSTEP 使用 Display Postscript 实现文字和图形的屏幕显示,而 Cocoa 依赖苹果的 Quartz(基于 PDF 的绘图模型)。

以上内容参考:网络-Cocoa

6. 如何安装homebrew-cask

安装homebrew cask

homebrew cask可用于mac应用程序或套件,比如mactex,xtrafinder等。

brew install caskroom/cask/brew-cask

使用homebrew管理软件

1、安装软件

比如安装emacs和vim的命令分别如下。

2、安装emacs

brew install emacs --with-cocoa --with-gnutls

3、安装macvim

brew install macvim --with-override-system-vim

安装ack和ag,比grep好用

brew install ack ag

4、安装autojump,非常高效的目录跳转工具

brew install autojump

查找软件包

比如查找和pdf相关的软件包。

1、查找和pdf相关的软件包

brew search pdf

删除软件包

1、移除macvim

brew remove macvim

清除老版本的安装包

1、homebrew 会缓存下载的安装包,长时间不清理会占用大量的磁盘空间,因此需要定期清理,清理命令如下:

brew cleanup

7. cocoa和foundation框架的区别

区别是:
Cocoa是苹果公司为Mac OS X所创建的原生面向对象的API,是Mac OS X上五大API之一(其它四个是Carbon、POSIX、X11和Java)。不过,通过Java bridge、PasCocoa、PyObjC、CamelBones以及RubyCocoa等桥接技术,Java、Clozure CL、LispWorks、Object Pascal、Python、Perl、Ruby等其它工具或者语言也可以用来开发 Cocoa 应用。也有一些其它语言的Cocoa实现无须桥接,比如苹果公司开发的MacRuby和类似Lisp的Nu语言。不使用Xcode和Interface Builder,仅仅通过文本编辑器、GCC和GNU make工具也可以用Objective-C语言开发Cocoa应用。

Foundation—基础框架。框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础。如果要想使用foundation框架中的数据类型,那么包含它的主头文件就可以了。即#import<foundation/foundation.h>。
补充:core foundation框架相对底层,里面的代码几乎都是c语言的,而foundation中是OC的。

Cocoa不是一种编程语言(它可以运行多种编程语言),它也不是一个开发工具(通过命令行我们仍然可以开发Cocoa程序),它是创建Mac OS X和IOS程序的原生面向对象API,为这两者应用提供了编程环境。通常称为“Cocoa框架”,事实上Cocoa本身是一个框架的集合,它包含了众多子框架,其中最重要的要数“Foundation”和“UIKit”。前者是框架的基础,和界面无关,其中包含了大量常用的API;后者是基础的UI类库。

8. 求萨缪尔森的《经济学》 (中文和英文的 PDF) 史蒂芬.罗斯的 《公司理财》

只有萨缪尔森的《经济学》12版的中文,要不要?

9. 《TheSwiftProgrammingLanguage》pdf下载在线阅读,求百度网盘云资源

《The Swift Programming Language》(Apple Inc.)电子书网盘下载免费在线阅读

链接:https://pan..com/s/1CaDcw_ulyRog3ohxnuYOFg

提取码:gh89

书名:The Swift Programming Language

作者:Apple Inc.

豆瓣评分:8.5

出版年份:2014-6-2

内容简介:

Swift is a new programming language for creating iOS and OS X apps. Swift builds on the best of C and Objective-C, without the constraints of C compatibility. Swift adopts safe programming patterns and adds modern features to make programming easier, more flexible, and more fun. Swift’s clean slate, backed by the mature and much-loved Cocoa and Cocoa Touch frameworks, is an opportunity to reimagine how software development works.

This book provides:

- A tour of the language.

- A detailed guide delving into each language feature.

- A formal reference for the language.

阅读全文

与cocoapdf相关的资料

热点内容
荣耀怎样创建文件夹 浏览:625
如何用本机登陆远程服务器地址 浏览:680
黄小鸭解压文具盒 浏览:670
女程序员的转行方法 浏览:881
东风启辰车联网安装文件夹 浏览:524
华为怎么设置app时间锁 浏览:660
后宫app视频怎么下载 浏览:525
如何把图片转换从PDF格式 浏览:259
重写和重载的区别java 浏览:234
expressvpnandroid 浏览:84
储存卡被加密怎么解除 浏览:169
地球怎么压缩直径 浏览:780
金铲铲之战服务器爆满怎么进 浏览:160
同仁堂pdf 浏览:935
如何编译原理课程教材 浏览:730
单片机控制显示器 浏览:776
顶好花app下载怎么找不到 浏览:989
手机命令大全 浏览:808
怎么下邮政银行app 浏览:250
不背单词app单词怎么学习 浏览:481