【Cocoa简介】
Cocoa是苹果公司为Mac OS X所创建的原生面向对象API 是Mac OS X上五大API之一。(其他四个:Carbon POSIX X11 Java)它是苹果的面向对象开发框架,主要开发语言为OC。OC是C的超集。
在此提一下这么几个内容
1.动态绑定
多数面向对象的编程语言 调用方法是直接调用内存中一段固定代码实现,由于这种方法需要预定义的处理命令的类限制了程序设计,通常采用责任链模式作为其设计模式,Cocoa中虽然也大量采用,但是动态绑定的动态绑定特性增加了更多设计自由。
OC中,消息机制由selector代表,描述需要调用方法的字符串,在发送消息时被放在运行时在方法列表寻找方法,调用方法实现。由于selector是文本数据,因此可以保存在文件中,方法的实现是在运行时查找的,而非编译时。这样的做法会造成一些性能损失,但动态绑定允许相同的selector代表不同的实现。
利用这些特性,Cocoa提供了一种通用的数据管理技术,称为键-值编码(KVC)。这种技术允许对象的数据或属性可以在运行时通过其键名进行查找,其中,属性的名称即为其值的键名。在静态语言中,这样的做法是不可能的。KVC大大的增加了设计的自由度:通过KVC,无需知道对象的类型即可访问其属性或数据。另外,利用键-值-观测器(KVO)技术和NSUndoManager类,可以提供自动的撤销/重做支持
2.内存管理 OC中是用引用计数来实现的。后期会继续跟进内存管理的内容。
3.主要框架
Fundation 
作为通用的面向对象的函数库,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框架管理了全部的绘图操作,例如裁剪,滚动,缩放等,程序员可以不再重复实现基础的功能,而可以集中于提供程序的关键功能上。
4.基础对象
Cocoa中最有用的特性是系统提供的强大的“基础对象”,例如Foundation中的NSString和NSAttributedString类,提供了Unicode字符串的支持;而AppKit中的NSText系统则允许程序员在GUI中放置字符串对象。
NSText及其相关类是用于显示和编辑字符串的。这些对象允许程序实现简单的单行文本框,也可以实现完整的多页,多栏文本显示方案 ,方案同时可以提供支持完整的专业排版特性,例如压缩字符,合字,环绕形状的文字,旋转,完整的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 的功能。
iOS开发是基于cocoa框架的。cocoa框架类图

UIKit是UI类库。
Fundation是框架基础。
Cocoa Touch框架包含创建世界一流 iOS 应用程序所需的所有框架,从 3D 图形、专业音频到网络,甚至提供特殊设备访问 API 以控制摄像机或从 GPS 硬件获取位置。Cocoa Touch 既包含只需要几行代码就可以完成全部任务的强大的 Objective-C 框架,也在需要时提供基础的 C 语言 API 来直接访问系统。这些框架示例包括:

Core Animation

通过 Core Animation,您就可以通过基于组合独立图层的简单编程模型来创建丰富的用户体验。

Core Audio

Core Audio 是播放、处理和录制音频的专业级技术,能够轻松为您的应用程序添加强大的音频功能。

Core Data

Core Data 提供面向对象的数据管理解决方案,该方案易于使用和理解,甚至可处理任何应用或大或小的数据模型。
Cocoa Touch框架主要包含:UIKit,MapKit,Game Kit,Message UI/Address Book UI
  1. UIKit 负责启动和结束应用程序,控制界面和多触点事件
  2. Map Kit 提供地图的相关服务,定位或者区域检测等
  3. Game Kit 创建和使用网络机制
  4. Message UI/Address Book UI 提供操作电子邮件和联系人的信息

Foundation类层次的根是NSObject类,它(和NSObject及NSCopying协议一起)定义了基本的对象属性和行为。NSObject是一个抽象类,该类被其他类继承来产生对象。Foundation框架的剩余部分由几组相互关联的类和一些独立的类组成。

代表基本数据类型:如字符串(NSString等)字节数组 NSArray等 存储其他对象的集合类NSSet
代表系统信息:如日期类
代表系统实体类 端口 进程 线程
Fundation第一部分

Fundation第二部分

Foundation第三部分

图示解析:

值对象:

值对象封装各种类型数据,提供对数据进行访问和操作的路径,因为他们都是对象,所以可以对它们进行归档、解档。

NSData类为字节流提供面向对象的存储空间

NSValue合NSNumber为简单的数据类型提供面向对象的存储空间,

NSDate NSCalendarDate NSTimeZone NSCanlendar NSDataCompoments 和NSLocale类提供代表时间日期日历和地域设置的对象 其包含的方法可以用于计算日期和时间差,以各种格式显示日期和时间,以及调整世界上各个位置时间和日期

字符串。NSString是另一类值对象,负责为以null结尾的、具有特定编码的字节数组提供面向对象的存储空间。它支持对UTF-16、UTF-8、MacRoman、和很多其它编码的字符串之间进行转换。NSString还提供对字符串进行检索、组合、和比较、以及对文件系统路径进行操作的方法。您可以用NSScanner对象来对NSString对象中的数字和词进行解析。NSCharacterSet(显示在框图中的集合类部分)代表可以在各个NSString和NSScanner方法中使用的一组字符。

集合。集合是以一定的顺序存储和访问其它对象(通常是数值)的对象。NSArray的索引从0开始,NSDictionary使用键-值对,而NSSet则负责对象的随机存储(NSCountedSet类使集合具有唯一标识)。通过NSEnumerator对象,您可以访问一个集合中的元素序列。集合对象是属性列表的必要元素,和其它所有对象一样,它也可以被归档和分发

操作系统服务。 很多Foundation类为访问各种底层的操作系统服务提供便利,同时又把开发者从操作系统的具体特性隔离开来。举例来说,您可以通过NSProcessInfo类查询应用程序运行的环境;通过NSHost类得到主机系统在网络中的名称和地址;通过NSTimer对象,您可以按指定的时间间隔向其它对象发送消息;NSRunLoop可以帮您管理应用程序或其它类型程序的输入源;而NSUserDefaults则为存储全局(主机级别)和用户级缺省值(预置)的系统数据库提供编程接口。

文件系统和URL。 NSFileManager为诸如创建、重命名、删除、和移动文件这样的文件操作提供统一的接口。NSFileHandle则可以进行较为底层的文件操作(比如文件内查找操作)。NSBundle可以寻找存储在程序包中的资源,可以动态装载某些资源(比如nib文件和代码)。您可以用NSURL和NSURLHandle类来表示、访问、和管理源于URL的数据。

进程间通讯。 这个范畴中的大部分类代表不同的系统端口、套接字、和名字服务器,对实现底层的IPC很有用。NSPipe代表一个BSD管道,即一种进程间的单向通讯通道。

线程和子任务。 NSThread类使您可以创建多线程的程序,而各种锁(lock)类则为彼此竞争的线程在访问进程资源时提供各种控制机制。通过NSTask,您的程序可以分出一个子进程来执行其它工作或进行进度监控。

归档和序列化。这个范畴中的类使对象分发和持久保留成为可能。NSCoder及其子类和NSCoding协议一起,可以以独立于架构的方式来表示对象中包含的数据,可以将类信息和数据一起存储。

表达式和条件判断。条件判断类,即NSPredicate、NSCompoundPredicate、和NSComparisonPredicate类,负责对获取或过滤对象的逻辑约束条件进行封装。NSExpression对象则代表条件判断中的表达式。

Spotlight查询。NSMetadataItem、NSMetadataQuery和相关的查询类对文件系统的元数据进行封装,使元数据的查询成为可能。
Objective-C语言服务。NSException和NSAssertionHandler类为代码中的断言和例外处理提供了面向对象的封装。NSInvocation对象是Objective-C消息的静态表示,您的程序可以对它存储,并在之后用于激活另一个对象的消息。undo管理器(NSUndoManager)和分布式对象(Distributed Objects)系统都用到了这种对象。NSMethodSignature对象负责记录方法的类型信息,可以用于信息的推送。NSClassDescription则是一个抽象类,用于定义和查询类的关系和属性。
脚本。这个范畴中的类可以帮助您实现对AppleScript脚本和Apple Event命令的支持。
分布式对象。 您可以通过分布式对象类来进行同一台电脑或一个网络中的不同电脑上的进程间通讯。其中的两个类-NSDistantObject和NSProtocolChecker的根类(NSProxy)和Cocoa其它部分的根类不同。
网络。NSNetService和NSNetServiceBrowser类支持称为Bonjour的零配置网络架构。Bonjour是在IP网络上发布和浏览服务的强大系统。

UIKit主要用于界面架构 类结构如下

常用结构体

在Foundation中定义了很多常用结构体类型来简化我们的日常开发,这些结构体完全采用Objective-C定义,和我们自己定义的结构体没有任何区别,之所以由框架为我们提供完全是为了简化我们的开发。常用的结构体有NSRange、NSPoint、NSSize、NSRect等

可以看到对于常用结构体在Foundation框架中都有一个对应的make方法进行创建,这也是我们日后比较常用的操作;而且与之对应的还都有一个NSStringFromXX方法来进行字符串转换,方便我们调试。上面也提到NSSize其实就是CGSize,NSRect其实就是CGRect,我们可以通过查看代码进行确认,例如NSSize定义:

/* Sizes. */

struct CGSize {

    CGFloat width;

    CGFloat height;

};

typedef struct CGSize CGSize;

下一篇将从Fundation的API开始写起。

【iOS开发】从Cocoa框架说开去--Fundation框架系列相关推荐

  1. 苹果iOS开发深入浅出Cocoa之类与对象

    [IT168技术]最近打算写一些ObjC中比较底层的东西,尤其是 runtime 相关的.苹果已经将 ObjC runtime 代码开源了,我们可以从:http://opensource.apple. ...

  2. 【无限互联】iOS开发视频教程— 2.8 iPhone开发之swtch语句

    核心内容 1. switch语句语法 2. 防止case穿透,与break结合使用 视频地址:iPhone开发之swtch语句

  3. 那些在学习iOS开发前就应该知道的事(part 1)

    2019独角兽企业重金招聘Python工程师标准>>> 英文原文:Things I wish I had known before starting iOS development- ...

  4. iOS开发针对对Masonry下的FPS优化讨论

    今天博客的内容就系统的讨论一下Masonry对FSP的影响,以及如何更好的使用Masonry.如果你对iOS开发足够熟悉的话,那么对Masonry框架应该不陌生.简单的说,Masonry的诞生让Aut ...

  5. 学习iOS开发前要知道的事儿

    英文原文:Things I wish I had known before starting iOS development-Part 1 设计师设计出来了一个不错的引导界面,然而当我看到设计稿的时候 ...

  6. 那些在学习iOS开发前就应该知道的事

    原文请看:http://www.cocoachina.com/ios/20150608/12052.html 那些在学习iOS开发前就应该知道的事 2015-06-08 09:14 编辑:suilin ...

  7. iOS开发的知名个人博客及几个网站

    网站推荐 https://www.raywenderlich.com/ https://talk.objc.io/ https://objccn.io/ http://gold.xitu.io/ 网站 ...

  8. iOS开发的知名大牛博客小汇

    王巍的博客:王巍目前在日本横滨任职于LINE.工作内容主要进行Unity3D开发,8小时之外经常进行iOS/Mac开发.他的陈列柜中已有多款应用,其中番茄工作法工具非常棒. http://onevca ...

  9. 从今天开始学习iOS开发(iOS 7版)-- 概论 (一)

    <Start Developing iOS Apps Today>为iOS开发提供了完美的起点.你可以在Mac上创建运行在iPad,iPhone和iPod touch上的iOS app.查 ...

最新文章

  1. ASP.NET 例程完全代码版(3)——随意创建图形信息
  2. mysql 5.1 innodb trx_mysql 优化innodb_flush_log_at_trx_commit的案例介绍
  3. OpenCV实现图像对齐ECC算法(附完整代码)
  4. 企业选择使用混合云集成的原因
  5. jsp:include和%@include file=%的区别(简单了解)
  6. 数据库程序设计课堂笔记
  7. 学计算机买小米air可以么,Mi 小米 Air13.3 笔记本电脑 三个月使用体验
  8. 搭建cocos2d-x-android环境 Windows XP3 + Eclipse + NDKR7(或ndkr7b)+COCOS2DX(没有用到cygwin和minigw)...
  9. Java数据持久层框架
  10. raw数据拆分成rggb四通道,拆分与合成
  11. Servlet 身份验证体系结构(源码)
  12. 【AIOT】手表调研
  13. linpack测试软件,服务器性能测试(linpack,stream,netperf,iometer)
  14. Mac Brew安装及换源教程
  15. dax-自定义周做同比和环比
  16. vue配置开发、测试、生产环境(proxy中获取process.env.NODE_ENV)
  17. Java中Lambda表达式和stream的使用
  18. 发json请求,报415错误。POST http://localhost:8080/ 415
  19. python字符串如何交叉_Python-两个字符串的交集
  20. arcgis怎么生成一个html,arcgis desktop 10.x怎么生成1:100万、1:50万等标准图幅经纬网格...

热门文章

  1. 一篇文章带你入门 SpringSecurity实现密码加密和解码
  2. oracle参数open_cursors和session_cached_cursor详解!
  3. 《喝彩中华》李小萌王雷同台演绎“霸王别姬”
  4. 微软.NET手持设备开发工具包基础篇
  5. Ros 应用程序的多种调试方法
  6. 配置并使用SharePoint 2010的文档转换功能
  7. 突破海康相机255预置点的限制
  8. 腾讯安全获ISACA认证,提供一站式安全人才培训服务
  9. 线性代数中向量、矩阵深度理解(PartI)
  10. uniapp之APP/微信小程序/公众号支付