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框架,只有动态运行库, 称为 kit, 最重要的是AppKit. 1993 年 NeXTSTEP 3.1 被移植到了 Intel, Sparc, HP 的平台上,Foundation 首次被加入,同时Sun 和 NeXT 合作开发OpenStep 也可以运行在Windows 系统上VCV。

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编程环境让程序在多方面自动遵循苹果公司的人机界面守则。

发展历史

编辑

更多资料:Mac OS X历史
Cocoa 是从1980年代由 NeXT 开发的编程环境 NeXTSTEP 和 OPENSTEP 演变而来,这点可由其类别之名皆以 NS 前缀(代表NeXTSTEP)看出端倪。苹果电脑公司在1996年12月收购了NeXT。开发 NeXTSTEP 和 OPENSTEP 的大量工作都转化到了 Mac OS X 中,最显而易见的部分当属 Cocoa。但差异也存在。例如,NeXTSTEP 和 OPENSTEP 使用 Display Postscript 实现文字和图形的屏幕显示,而 Cocoa 依赖苹果的 Quartz(基于 PDF 的绘图模型)。
Cocoa 这个名词曾经被用来称呼一款帮助儿童创建多媒体工程的应用程序。随后该应用停产。该名称被用作现在的用途。

开发过程

编辑

施乐帕罗奥多研究中心的Smalltalk开发小组最终发明了一种可以简化开发过程,提高代码重用率的设计哲学,即“模型-视图-控制器”模式(MVC)。这种模式将应用程序分为三个可以交互的对象集,即模型,视图和控制器。其中,模型类代表原始数据,例如文档、设置、文件、内存中的对象等,视图是模型中数据的可视化表现,而控制器类则包含了将模型和其对应视图连接起来的逻辑,并保持前二者的状态同步。
Cocoa的设计遵循了严格的MVC原则。在OpenStep下,绝大多数的类要么是高层的视图类(AppKit),或者是相对底层的模型类(Foundation)。与类似的MVC系统相比,OpenStep没有强的模型层,例如它不包含表示“文档”的存储类。在向Cocoa迁移的过程中,模型层被大大扩展了,引入了一系列的类,它们提供了一些桌面程序所需的常用功能。
在Mac OS X 10.3中,苹果引入了NSController系列类以提供预定义的控制器层。这些类是Cocoa绑定系统的一部分,该系统也允许使用类似键-值-观测器和键-值-绑定协议来对其进行扩展。其中,“绑定”的概念表明两个对象(通常是视图和控制器)之间的关系。绑定使得开发者可以集中于定义这种关系,而不是编写大量的“胶水代码”来实现这些关系。
在Mac OS X 10.4中,苹果引入了Core Data框架,进一步扩展了这种概念。Core Data标准化了对更改的追踪和模型层的保存行为。因此,该框架大大简化了改变应用程序数据,撤销更改,在磁盘中保存和读取数据的过程。
通过提供对MVC模型中全部3层的框架支持,苹果的目的在于减少程序员所需编写的“胶水代码”量,以解放这些资源而用于程序的真正特性。

动态绑定

编辑

在多数面向对象的编程语言中,调用方法是由直接调用内存中一段固定的代码实现的。由于这种方法需要预定义的处理命令的类,因而限制了程序的设计,通常采用责任链模式作为其设计模式。虽然Cocoa在多数地方仍然采用这种方式,但通过Objective-C的动态绑定特性增加了更多设计的自由性。
在Objective-C中,消息由selector所代表,其为描述需要调用的方法的一个字符串。在发送消息时,该selector被送入Objective-C运行时中,在可用方法列表中寻找对应的方法,然后调用该方法的实际实现。由于selector只是文本数据,因此它可以保存在文件中,通过网络或在进程间传输,或以其它方式进行操作。方法的实现是在运行时查找的,而非编译时。这样的做法会造成一些性能损失,但动态绑定允许相同的selector代表不同的实现。
利用这些特性,Cocoa提供了一种通用的数据管理技术,称为键-值编码(KVC)。这种技术允许对象的数据或属性可以在运行时通过其键名进行查找,其中,属性的名称即为其值的键名。在静态语言中,这样的做法是不可能的。KVC大大的增加了设计的自由度:通过KVC,无需知道对象的类型即可访问其属性或数据。另外,利用键-值-观测器(KVO)技术和NSUndoManager类,可以提供自动的撤销/重做支持。

内存管理

编辑

Cocoa环境的一个特点是它可以管理动态分配的内存。Cocoa中绝大部分类的基类都是NSObject,它实现了引用计数的内存管理模型。从NSObject继承的类可以响应retain和release消息,以增减其引用计数;也可以通过发送retainCount消息来获取其引用计数。一个以alloc ,copy或Objective-C 2.0中增加的new所创建的对象的引用计数为1;向对象发送retain消息会将计数加1,而发送release消息则会将计数减1。若对象的引用计数减少到了0,则它会被销毁。dealloc消息类似于C++中的析构函数,在对象被销毁之前可能会被调用,但系统不保证会发送该消息。这种引用计数的模型与微软的COM中的IUnknown接口特性十分相似,它提供了AddRef和Release接口,与retain和release对应。
从Objective-C 2.0开始,Objective-C运行时实现了可选的垃圾收集器。若垃圾收集的特性被激活,则运行时会将引用计数相关的操作,例如“retain”和“release”,变为无操作。iOS上的Objective-C 2.0实现中不包含垃圾收集器。垃圾收集器运行在一个低优先级的后台线程中,并可以在用户动作时暂停,从而保持良好的用户体验。

主要框架

编辑

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框架管理了全部的绘图操作,例如裁剪,滚动,缩放等,程序员可以不再重复实现基础的功能,而可以集中于提供程序的关键功能上。

基础对象

编辑

Cocoa中最有用的特性是系统提供的强大的“基础对象”,例如Foundation中的NSString和NSAttributedString类,提供了Unicode字符串的支持;而AppKit中的NSText系统则允许程序员在GUI中放置字符串对象。
NSText及其相关类是用于显示和编辑字符串的。这些对象允许程序实现简单的单行文本框,也可以实现完整的多页,多栏文本显示方案 ,方案同时可以提供支持完整的专业排版特性,例如压缩字符,合字,环绕形状的文字,旋转,完整的Unicode支持和反锯齿字形渲染。段落格式可以自动控制或由用户自定义;可以使用内建的“ruler”对象附加到任何文本视图上。这些类也有自动拼写检查特性,该特性使用一个由所有程序共享的字典。另外,也允许无限制数量的撤销/重做操作。只使用内建的特性,任何人都可以只用不到10行代码写出一个具备上述特性的文本编辑器,而若使用Cocoa绑定,甚至可以不用写一行代码。
若需要对已有特性进行扩展,Objective-C中的类别特性使得这项操作变得相当容易。通过类别可以直接对已有类进行功能添加,而无需对其进行更改或获得其源代码。一般而言,这样的目的需要通过继承原有的类并修改原有的代码,将原有的类以新的子类代替来完成。

基础对象

编辑

Cocoa中最有用的特性是系统提供的强大的“基础对象”,例如Foundation中的NSString和NSAttributedString类,提供了Unicode字符串的支持;而AppKit中的NSText系统则允许程序员在GUI中放置字符串对象。
NSText及其相关类是用于显示和编辑字符串的。这些对象允许程序实现简单的单行文本框,也可以实现完整的多页,多栏文本显示方案 ,方案同时可以提供支持完整的专业排版特性,例如压缩字符,合字,环绕形状的文字,旋转,完整的Unicode支持和反锯齿字形渲染。段落格式可以自动控制或由用户自定义;可以使用内建的“ruler”对象附加到任何文本视图上。这些类也有自动拼写检查特性,该特性使用一个由所有程序共享的字典。另外,也允许无限制数量的撤销/重做操作。只使用内建的特性,任何人都可以只用不到10行代码写出一个具备上述特性的文本编辑器,而若使用Cocoa绑定,甚至可以不用写一行代码。
若需要对已有特性进行扩展,Objective-C中的类别特性使得这项操作变得相当容易。通过类别可以直接对已有类进行功能添加,而无需对其进行更改或获得其源代码。一般而言,这样的目的需要通过继承原有的类并修改原有的代码,将原有的类以新的子类代替来完成。

实现

编辑

Cocoa 本身由 Objective-C 语言写成,因此 Objective-C 是开发 Cocoa 应用的首选语言。虽然也提供 Java 到 Cocoa 的绑定,但是在开发者中并未得到广泛采用。而且,由于使用桥接机制,Java 的绑定并不能全面利用 Cocoa 的所有功能。2005年,苹果公司宣布 Java 的 Cocoa 绑定在 Mac OS X 10.4 和之后版本中属被废弃的技术。换句话说,Cocoa API 中可能会逐渐出现不支援 Java 的功能。
作为 Xcode 一部分的 AppleScript Studio 工具允许用户和开发者用 AppleScript 编写一些简单的 Cocoa 应用。第三方实现的绑定有 Clozure CL、LispWorks、PyObjC (Python)、RubyCocoa (Ruby)、CamelBones (Perl)、Cocoa#、Monobjc (C#) 和 NObjective(C#)。Nu 语言直接使用 Objective-C 的对象模型,所以无须绑定就可以调用 Cocoa API。
也有开源项目把 Cocoa 的大部分在其它操作系统上实现(包括 Windows),从而使开发跨平台的 Cocoa 应用成为可能。比如 GNUStep 和 Cocotron。

[HMLY]8.Cocoa的更多相关文章

  1. [HMLY]9.深入浅出-iOS Reactive Cocoa的常见用法

    简介 今天的主角是Reactive Cocoa,聊聊Reactive Cocoa的常见使用:KVO.Target.Delegate.Notification. Reactive Cocoa 是一个重量 ...

  2. Cocoa深入学习:NSOperationQueue、NSRunLoop和线程安全 (转)

    目前在 iOS 和 OS X 中有两套先进的同步 API 可供我们使用:NSOperation 和 GCD .其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实 ...

  3. cocoa框架 for iOS

    1.Cocoa是什么? Cocoa是OS X和 iOS操作系统的程序的运行环境. 是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发中你可以使用各种语言:也不是开发工具,你可 ...

  4. Cocoa Touch事件处理流程--响应者链

    Cocoa Touch事件处理流程--响应者链 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9264335 转载请注明 ...

  5. ios基础篇(二十九)—— 多线程(Thread、Cocoa operations和GCD)

    一.进程与线程 1.进程 进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内: 如果我们把CPU比作一个工厂,那么进程就好比工厂的车间,一个工厂有 ...

  6. NSThread 子线程 Cocoa NSOperation GCD(Grand Central Dispatch) 多线程

    单词:thread 英 θred:n 线.思路.vt 穿过.vi 穿透过 一.    进程.线程 进程:正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间 线程: ...

  7. [Cocoa设计模式] 动态创建

    Cocoa利用底层Objective-C运行时的很多特性,包括能够创建在应用程序编译时不存在的类的实例并在运行时动态加载和链接新类.诸如Ruby, Perl, Python之类的脚本语言就利用这种技术 ...

  8. Cocoa是什么?

    一.什么是Cocoa ①Cocoa的来源 早些年,苹果公司启动了Copland计划,致力于开发出自己的操作系统,可惜后来Copland计划逐渐的失控了,苹果公司最终决定放弃开发,转向从别的公司购买下 ...

  9. 使用Swift代码演示Cocoa框架

    通过使用简单的代码学习Cocoa框架,每一个例子都通过代码和StoryBoard实现,并且总结他们的各自特点 所有完整代码将会托管到github库,https://github.com/land-pa ...

随机推荐

  1. Asp.Net MVC页面静态化功能实现二:用递归算法来实现

    上一篇提到采用IHttpModule来实现当用户访问网站的时候,通过重新定义Response.Filter来实现将返回给客户端的html代码保存,以便用户下一次访问是直接访问静态页面. Asp.Net ...

  2. svn搭建

    原文:svn搭建 二.Subversion的安装与测试 Subversion的配置方式有很多种,同时也可以配置不同的操作系统之上,本文我讲解的是Subversion 1.5.4 for Apache2 ...

  3. 笔试 - 高德软件有限公司python问题 和 答案

    高德软件有限公司python问题 和 答案 本文地址: http://blog.csdn.net/caroline_wendy/article/details/25230835 by Spike 20 ...

  4. 构建日均千万PV Web站点1

    如何构建日均千万PV Web站点 (一) 其实大多数互联网网站起初的网站架构都是(Linux+Apache+MySQL+PHP). 不过随着时代的发展,科技的进步.互联网进入寻常百姓家的生活.所谓的用 ...

  5. Java、C#双语版HttpHelper类

    Java.C#双语版HttpHelper类(解决网页抓取乱码问题)   在做一些需要抓取网页的项目时,经常性的遇到乱码问题.最省事的做法是去需要抓取的网站看看具体是什么编码,然后采用正确的编码进行解码 ...

  6. Redis for Windows(C#缓存)配置文件详解

    Redis for Windows(C#缓存)配置文件详解   前言 在上一篇文章中主要介绍了Redis在Windows平台下的下载安装和简单使用http://www.cnblogs.com/aehy ...

  7. Android编程心得-在任意类中获取当前屏幕宽高

    进行Android编程时,很多时候都需要获取当前屏幕的宽度与高度,但是当我们需要在别的类中调用屏幕宽高时,直接用原来的方法是不行的,下面我来介绍如何在任意类中调用宽度高度的两种方法. public v ...

  8. session验证登陆- 页面跳转

    用session验证登陆,当用户想访问一个页面时由于没有登录,就跳转到登录页面,登录后跳转到用户请求的页面,在session跳转中传上次请求的页面.  怎么获得这个url值并跳转到该页面呢? 以此跳转 ...

  9. 使用数据流的方式 将数据导出到指定形式到Word中 (不使用插件,很简单的一种)

    protected void Page_Load(object sender, EventArgs e) { string fileName = "路政许可事项办理流转情况汇总统计" ...

  10. Xilinx-Zynq Linux内核源码编译过程

    本文内容依据http://www.wiki.xilinx.com网址编写,编译所用操作系统为ubuntu 14 1.交叉编译环境的安装配置 1)http://www.wiki.xilinx.com/I ...