fbpx
维基百科

Cocoa

Cocoa苹果公司macOS所创建的原生面向对象应用程序接口,是Mac OS X上五大API之一(其它四个是CarbonPOSIXX11Java)。

Cocoa应用程序一般在苹果公司的开发工具Xcode(前身为Project Builder英语Project Builder)和Interface Builder上用Objective-C写成。不过,通过Java bridge、PasCocoa英语PasCocoaPyObjC英语PyObjCCamelBones英语CamelBones以及RubyCocoa英语RubyCocoa等桥接技术,JavaClozure CLLispWorks英语LispWorksObject PascalPythonPerlRuby等其它工具或者语言也可以用来开发Cocoa应用。也有一些其它语言的Cocoa实现无须桥接,比如苹果公司开发的MacRuby英语MacRuby和类似LispNu语言。不使用Xcode和Interface Builder,仅仅通过文本编辑器、GCCGNU make工具也可以用Objective-C语言开发Cocoa应用。

对最终用户来说,使用Cocoa编程环境开发的应用程序即为Cocoa應用程式。这类应用有独特的外观,因为Cocoa编程环境让程序在多方面自动遵循苹果公司的人机界面守则英语Human interface guidelines

Cocoa历史 编辑

Cocoa是从1980年代由NeXT开发的编程环境NeXTSTEP和OPENSTEP演变而来,這點可由其類別之名皆以NS前綴(代表NeXTSTEP)看出端倪。苹果电脑公司在1996年12月收购了NeXT。开发NeXTSTEP和OPENSTEP的大量工作都转化到了Mac OS X中,最显而易见的部分当属Cocoa。但差异也存在。例如,NeXTSTEP和OPENSTEP使用Display PostScript实现文字和图形的屏幕显示,而Cocoa依赖苹果的Quartz(基于PDF的绘图模型)。

Cocoa这个名词曾经被用来称呼一款帮助儿童创建多媒体工程的应用程序。随后该应用停产。该名称被用作现在的用途。

内存管理 编辑

Cocoa环境的一个特点是它可以管理动态分配的内存。Cocoa中绝大部分类的基类都是NSObject,它实现了引用计数的内存管理模型。从NSObject继承的类可以响应retainrelease消息,以增减其引用计数;也可以通过发送retainCount消息来获取其引用计数。一个以alloccopyObjective-C 2.0中增加的new所创建的对象的引用计数为1;向对象发送retain消息会将计数加1,而发送release消息则会将计数减1。若对象的引用计数减少到了0,则它会被销毁。dealloc消息类似于C++中的析构函数,在对象被销毁之前可能会被调用,但系统不保证会发送该消息。这种引用计数的模型与微软COM中的IUnknown接口特性十分相似,它提供了AddRefRelease接口,与retainrelease对应。

Objective-C 2.0开始,Objective-C运行时实现了可选的垃圾收集器。若垃圾收集的特性被激活,则运行时会将引用计数相关的操作,例如“retain”和“release”,变为无操作iOS上的Objective-C 2.0实现中不包含垃圾收集器。垃圾收集器运行在一个低优先级的后台线程中,并可以在用户动作时暂停,从而保持良好的用户体验。[1]

主要框架 编辑

Cocoa包含三个主要的Objective-C对象库,称为“框架”。框架的功能类似于动态库,即可以在运行时动态的载入应用程序的地址空间,但框架作为一个捆绑而非独立文件,其中除了可执行代码外,也包含了资源,头文件和文档。

  • 应用程序工具包英语AppKit”,或称AppKit(Application Kit)是直接衍生自NeXTSTEP的AppKit的。它包含了程序与图形用户界面交互所需的代码。它是基于Foundation建立的,也使用“NS”前缀。它只能在Mac OS X中使用。
  • “用户界面工具包”,或称UIKit(User Interface Kit),是用于iOS的图形用户界面工具包。与AppKit不同,它使用“UI”的前缀。

Cocoa构架的一个关键部分是其多样的视图模型。总体而言,它是基于由Quartz提供的PDF绘制模型的,该特性允许使用PostScript绘制自定义图形内容,同时也自动的支持了打印机以及类似设备。由于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只是文本数据,因此它可以保存在文件中,通过网络或在进程间传输,或以其它方式进行操作。方法的实现是在运行时查找的,而非编译时。这样的做法会造成一些性能损失[2],但动态绑定允许相同的selector代表不同的实现。

利用这些特性,Cocoa提供了一种通用的数据管理技术,称为键-值编码(KVC)[3]。这种技术允许对象的数据或属性可以在运行时通过其键名进行查找,其中,属性的名称即为其值的键名。在静态语言中,这样的做法是不可能的。KVC大大的增加了设计的自由度:通过KVC,无需知道对象的类型即可访问其属性或数据。另外,利用键-值-观测器(KVO)技术和NSUndoManager类,可以提供自动的撤销/重做支持[4]

Rich objects 编辑

Cocoa中最有用的特性是系统提供的强大的“基础对象”,例如Foundation中的NSStringNSAttributedString类,提供了Unicode字符串的支持;而AppKit中的NSText系统则允许程序员在GUI中放置字符串对象。

NSText及其相关类是用于显示和编辑字符串的。这些对象允许程序实现简单的单行文本框,也可以实现完整的多页,多栏文本显示方案 ,方案同时可以提供支持完整的专业排版特性,例如压缩字符英语Kerning合字,环绕形状的文字,旋转,完整的Unicode支持和反锯齿字形渲染。段落格式可以自动控制或由用户自定义;可以使用内建的“ruler”对象附加到任何文本视图上。这些类也有自动拼写检查特性,该特性使用一个由所有程序共享的字典。另外,也允许无限制数量的撤销/重做操作。只使用内建的特性,任何人都可以只用不到10行代码写出一个具备上述特性的文本编辑器,而若使用Cocoa绑定,甚至可以不用写一行代码。

若需要对已有特性进行扩展,Objective-C中的类别特性使得这项操作变得相当容易[5]。通过类别可以直接对已有类进行功能添加,而无需对其进行更改或获得其源代码。一般而言,这样的目的需要通过继承原有的类并修改原有的代码,将原有的类以新的子类代替来完成。

实现 编辑

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[6]

参考文献 编辑

  1. ^ Apple Computer, Inc. . Developer.apple.com. 2007-11-06 [2010-05-30]. (原始内容存档于2010-07-24). 
  2. ^ Wikibooks - Some Objective-C advantages. [2010-10-16]. (原始内容存档于2010-11-15). 
  3. ^ Key-Value Coding Programming Guide. [2010-10-16]. (原始内容于2013-05-04). 
  4. ^ Key-Value Observing Programming Guide[永久失效連結]
  5. ^ Categories and Extensions. [2010-10-16]. (原始内容于2009-08-26). 
  6. ^ Cocotron (页面存档备份,存于互联网档案馆) - Cocoa的免費版本
  • Aaron Hillegass: Cocoa Programming for Mac OS X, Addison-Wesley, 3rd Edition 2008, Paperback, ISBN 0-321-50361-9.
  • Stephen Kochan: Programming in Objective-C, Sams, 1st Edition 2003, Paperback, ISBN 0-672-32586-1.
  • Michael Beam, James Duncan Davidson: Cocoa in a Nutshell, O'Reilly, 1st Edition 2003, Paperback, ISBN 0-596-00462-1.
  • Erick Tejkowski: Cocoa Programming for Dummies, 1st Edition 2003, Paperback, ISBN 0-7645-2613-8.
  • Simson Garfinkel, Michael K. Mahoney: Building Cocoa Applications : A Step by Step Guide, O'Reilly, 1st Edition 2002, Paperback, ISBN 0-596-00235-1.
  • James Duncan Davidson: Learning Cocoa with Objective-C, O'Reilly, 2nd Edition 2002, Paperback, ISBN 0-596-00301-3.
  • Scott Anguish, Erik M. Buck, Donald A. Yacktman: Cocoa Programming, Sams, 1st Edition 2002, Paperback, ISBN 0-672-32230-7.
  • Bill Cheeseman: Cocoa Recipes for Mac OS X, Peachpit Press, 1st Edition 2002, Paperback, ISBN 0-201-87801-1.
  • Andrew Duncan: Objective-C Pocket Reference, O'Reilly, 1st Edition 2002, Paperback, ISBN 0-596-00423-0.
  • Apple Inc.: Learning Cocoa, O'Reilly, 1st Edition 2001, Paperback, ISBN 0-596-00160-6.

外部链接 编辑

cocoa, 此條目介紹的是macos的api, 关于日本厚生勞動省的應用程式, 请见, cocoa, 是苹果公司为macos所创建的原生面向对象的应用程序接口, 是mac, x上五大api之一, 其它四个是carbon, posix, x11和java, 開發者苹果公司编程语言c, objective, swift操作系统macos类型软件框架许可协议专有网站developer, apple, com应用程序一般在苹果公司的开发工具xcode, 前身为project, builder, 英语, project, . 此條目介紹的是macOS的API 关于日本厚生勞動省的應用程式 请见 COCOA Cocoa是苹果公司为macOS所创建的原生面向对象的应用程序接口 是Mac OS X上五大API之一 其它四个是Carbon POSIX X11和Java Cocoa開發者苹果公司编程语言C C Objective C Swift操作系统macOS类型软件框架许可协议专有网站developer apple comCocoa应用程序一般在苹果公司的开发工具Xcode 前身为Project Builder 英语 Project Builder 和Interface Builder上用Objective C写成 不过 通过Java bridge PasCocoa 英语 PasCocoa PyObjC 英语 PyObjC CamelBones 英语 CamelBones 以及RubyCocoa 英语 RubyCocoa 等桥接技术 Java Clozure CL LispWorks 英语 LispWorks Object Pascal Python Perl Ruby等其它工具或者语言也可以用来开发Cocoa应用 也有一些其它语言的Cocoa实现无须桥接 比如苹果公司开发的MacRuby 英语 MacRuby 和类似Lisp的Nu语言 不使用Xcode和Interface Builder 仅仅通过文本编辑器 GCC和GNU make工具也可以用Objective C语言开发Cocoa应用 对最终用户来说 使用Cocoa编程环境开发的应用程序即为Cocoa應用程式 这类应用有独特的外观 因为Cocoa编程环境让程序在多方面自动遵循苹果公司的人机界面守则 英语 Human interface guidelines 目录 1 Cocoa历史 2 内存管理 3 主要框架 4 模型 视图 控制器 5 动态绑定 6 Rich objects 7 实现 8 参考文献 9 外部链接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这个名词曾经被用来称呼一款帮助儿童创建多媒体工程的应用程序 随后该应用停产 该名称被用作现在的用途 内存管理 编辑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实现中不包含垃圾收集器 垃圾收集器运行在一个低优先级的后台线程中 并可以在用户动作时暂停 从而保持良好的用户体验 1 主要框架 编辑Cocoa包含三个主要的Objective C对象库 称为 框架 框架的功能类似于动态库 即可以在运行时动态的载入应用程序的地址空间 但框架作为一个捆绑而非独立文件 其中除了可执行代码外 也包含了资源 头文件和文档 Foundation工具包 英语 Foundation Kit 或简称为 Foundation 首先出现在OpenStep中 在Mac OS X中 它是基于Core Foundation 英语 Core Foundation 的 作为通用的面向对象的函数库 Foundation提供了字符串 数值的管理 容器及其枚举 分布式计算 事件循环 以及一些其它的与图形用户界面没有直接关系的功能 其中用于类和常数的 NS 前缀来自于Cocoa的来源 NeXTSTEP 它可以在Mac OS X和iOS中使用 应用程序工具包 英语 AppKit 或称AppKit Application Kit 是直接衍生自NeXTSTEP的AppKit的 它包含了程序与图形用户界面交互所需的代码 它是基于Foundation建立的 也使用 NS 前缀 它只能在Mac OS X中使用 用户界面工具包 或称UIKit User Interface Kit 是用于iOS的图形用户界面工具包 与AppKit不同 它使用 UI 的前缀 Cocoa构架的一个关键部分是其多样的视图模型 总体而言 它是基于由Quartz提供的PDF绘制模型的 该特性允许使用PostScript绘制自定义图形内容 同时也自动的支持了打印机以及类似设备 由于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只是文本数据 因此它可以保存在文件中 通过网络或在进程间传输 或以其它方式进行操作 方法的实现是在运行时查找的 而非编译时 这样的做法会造成一些性能损失 2 但动态绑定允许相同的selector代表不同的实现 利用这些特性 Cocoa提供了一种通用的数据管理技术 称为键 值编码 KVC 3 这种技术允许对象的数据或属性可以在运行时通过其键名进行查找 其中 属性的名称即为其值的键名 在静态语言中 这样的做法是不可能的 KVC大大的增加了设计的自由度 通过KVC 无需知道对象的类型即可访问其属性或数据 另外 利用键 值 观测器 KVO 技术和NSUndoManager类 可以提供自动的撤销 重做支持 4 Rich objects 编辑Cocoa中最有用的特性是系统提供的强大的 基础对象 例如Foundation中的NSString和NSAttributedString类 提供了Unicode字符串的支持 而AppKit中的NSText系统则允许程序员在GUI中放置字符串对象 NSText及其相关类是用于显示和编辑字符串的 这些对象允许程序实现简单的单行文本框 也可以实现完整的多页 多栏文本显示方案 方案同时可以提供支持完整的专业排版特性 例如压缩字符 英语 Kerning 合字 环绕形状的文字 旋转 完整的Unicode支持和反锯齿字形渲染 段落格式可以自动控制或由用户自定义 可以使用内建的 ruler 对象附加到任何文本视图上 这些类也有自动拼写检查特性 该特性使用一个由所有程序共享的字典 另外 也允许无限制数量的撤销 重做操作 只使用内建的特性 任何人都可以只用不到10行代码写出一个具备上述特性的文本编辑器 而若使用Cocoa绑定 甚至可以不用写一行代码 若需要对已有特性进行扩展 Objective C中的类别特性使得这项操作变得相当容易 5 通过类别可以直接对已有类进行功能添加 而无需对其进行更改或获得其源代码 一般而言 这样的目的需要通过继承原有的类并修改原有的代码 将原有的类以新的子类代替来完成 实现 编辑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 6 参考文献 编辑 Apple Computer Inc Leopard Technology Series for Developers Objective C 2 0 Overview Developer apple com 2007 11 06 2010 05 30 原始内容存档于2010 07 24 Wikibooks Some Objective C advantages 2010 10 16 原始内容存档于2010 11 15 Key Value Coding Programming Guide 2010 10 16 原始内容存档于2013 05 04 Key Value Observing Programming Guide 永久失效連結 Categories and Extensions 2010 10 16 原始内容存档于2009 08 26 Cocotron 页面存档备份 存于互联网档案馆 Cocoa的免費版本 Aaron Hillegass Cocoa Programming for Mac OS X Addison Wesley 3rd Edition 2008 Paperback ISBN 0 321 50361 9 Stephen Kochan Programming in Objective C Sams 1st Edition 2003 Paperback ISBN 0 672 32586 1 Michael Beam James Duncan Davidson Cocoa in a Nutshell O Reilly 1st Edition 2003 Paperback ISBN 0 596 00462 1 Erick Tejkowski Cocoa Programming for Dummies 1st Edition 2003 Paperback ISBN 0 7645 2613 8 Simson Garfinkel Michael K Mahoney Building Cocoa Applications A Step by Step Guide O Reilly 1st Edition 2002 Paperback ISBN 0 596 00235 1 James Duncan Davidson Learning Cocoa with Objective C O Reilly 2nd Edition 2002 Paperback ISBN 0 596 00301 3 Scott Anguish Erik M Buck Donald A Yacktman Cocoa Programming Sams 1st Edition 2002 Paperback ISBN 0 672 32230 7 Bill Cheeseman Cocoa Recipes for Mac OS X Peachpit Press 1st Edition 2002 Paperback ISBN 0 201 87801 1 Andrew Duncan Objective C Pocket Reference O Reilly 1st Edition 2002 Paperback ISBN 0 596 00423 0 Apple Inc Learning Cocoa O Reilly 1st Edition 2001 Paperback ISBN 0 596 00160 6 外部链接 编辑Apple的Cocoa文档 iDevApps Cocoa编程论坛 CocoaDev Cocoa Dev Central 页面存档备份 存于互联网档案馆 取自 https zh wikipedia org w index php title Cocoa amp oldid 68635009, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。