iOS系统基于Unix系统(Darwin),后来Apple公司为了满足移动设备的需求,加入了自己研发的应用层、媒体层、服务层。由此形成了一个独立的iOS系统。
Darwin本身就是一个完整的UNIX/BSD系统,具有UNIX体系惯有的高度可靠性和健壮性。
Darwin项目的创始公司是苹果公司,但Darwin完全是基于开源项目FreeBSD 5.0和Mach 3.0构建。
在iOS开发过程中,对iOS系统整体架构和核心框架的了解和学习是必不可少的一个环节。这样有助于我们开发者形成对iOS系统有一个相对系统健全的认识。
首先,我们先要了解【Cocoa Touch】框架:
我们通常称呼iOS的框架为Cocoa Touch框架,Cocoa Touch是一个框架的集合,里面包含了众多的子框架。每一个子框架都是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像、声音文件等其他资源,共享资源库定义应用程序可以调用的函数和方法。
框架中的类相互依赖构成一个整体,提供完善的某一方面的服务或解决方案,多个框架一起实现整个应用程序的结构。
由于应用程序的结构是通用的,开发者通过框架提供的函数和方法,做细致个性化的处理,从而满足不同应用的不同需求。
开发一个应用程序就是将需求细致化的代码插入到框架提供的设计中来组合成一个整体完成最终的应用设计。
iOS提供的许多可使用的框架,构成了iOS操作系统的层次结构,从上到下依次是:
1. Cocoa (Application) Layer(触摸层)
2. Media Layer (媒体层)
3. Core Services Layer(核心服务层)
4. Core OS Layer (核心系统操作层)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QxdQlfIs-1623204717581)(media/16226859611450/16226875260435.jpg)]
在四层之后就是硬件的内核和驱动层了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wJTtaqu-1623204717584)(media/16226859611450/16227048933011.jpg)]
注意:Cocoa (Application) Layer(触摸层)其实包含cocoa Touch layer(触摸层) 和Application Layer (应用层)。
应用层原本在触摸层上面,因为应用层是开发者自己实现,所以和触摸层合在一起.
每个层级提供不同的服务:
* 低层级结构提供基础服务如文件系统、内存管理、I/O操作等。
* 高层级结构建立在低层级结构之上提供具体服务如UI控件、文件访问。
其实每一层都包含多个子框架, 如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lMNuUywv-1623204717585)(media/16226859611450/16227022094248.jpg)]
批注:
触摸层【Cocoa Touch Layer】: 触摸层为应用程序的开发提供了常用应用基础关键技术支持的框架,其中大部分框架都与应用的外观有关界面,本质上,它负责用户在iOS设备上的触摸操作。如:
媒体层【Media Layer】: 媒体层提供图形、音频和视频等应用中视听方面的技术。如:
核心服务层【Core Services Layer】: 核心服务层提供给应用所需要的基础的系统服务。(这些服务中的最核心的是CoreFoundation和Foundation框架,定义了所有应用使用的数据类型。CoreFoundation是基于C的一组接口,Foundation是对CoreFoundation的OC封装)如:
核心操作系统层【Core OS Layer】: 系统核心层包含大多数底层级别接近硬件的功能,它所包含的框架常常被其它框架所使用。
在 官方介绍中描述:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TiNccUD3-1623204717587)(media/16226859611450/16227062312392.png)]
The Cocoa (Application) layer includes technologies for building an app’s user interface, for responding to user events, and for managing app behavior
该层(Cocoa层)是为创建App提供了用户界面基础,响应用户事件,并且可以管理App的行为。这其实就是Cocoa Touch Layer(触摸层,UIKit)的作用,只是官网省略了Application Layer(应用层),因为这一层主要就是app了,主要由开发人员完成。
综上所述,在上面所有的框架中,最重要也最经常使用的就是**Cocoa层的 UIKit框架和CoreServices层的 Foundation框架**框架
Cocoa框架是iOS应用程序的基础,是OS X和 iOS操作系统的程序的运行环境。
Cocoa程序由一些对象组成,而这些对象的类按继承树看,最后都是继承于它们的根类-NSObject。而且这些对象都是基于Objective-C语言下开发的运行环境。
是什么因素使一个iOS程序成为Cocoa程序呢?
Cocoa众多框架中最重要、最基本的两个框架是:Foundation和UIKit,两个框架的位置如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NCvWAB7h-1623204717589)(media/16226859611450/16226875260435.jpg)]
Foundation框架和界面无关,它定义了所有应用使用的数据类型。
UIKit框架和界面息息相关,它为创建App提供了用户界面基础,响应用户事件,并且可以管理App的行为。
Foundation框架为所有应用程序提供基本的系统服务。
应用程序中的UIKit框架和其他框架,都是建立在Foundation框架的基础结构之上。 Foundation框架提供许多基本的对象类和数据类型,使其成为应用程序开发的基础。
Foundation框架还制定了一些约定(如用于取消分配等任务)使代码更加一致,可复用性更好。
我们可以借助三个图来进一步了解Foundation框架,包括了Foundation所有的类,图中灰色的是iOS不支持的,灰色部分是OS X系统的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ABGTxOF0-1623204717590)(media/16226859611450/16227073428485.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WwRsDV5J-1623204717590)(media/16226859611450/16227073652573.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iqsOT43d-1623204717591)(media/16226859611450/16227073736522.jpg)]
由上图可知,绝大部分Foundation框架的类都继承NSObject,小部分继承NSProxy
将上图Foundation框架中的类进行逻辑分类如下:
对于Foundation框架中的一些基本类的使用方法可以了解一下这篇文章
UIKit框架提供的类,用于创建基于触摸的用户界面(UI)。所有iOS应用程序都是基于UIKit,没有这个框架,就无法交付应用程序。
UIKit框架提供应用程序对象,用于管理应用程序的基础架构。
UIKit框架用于在屏幕上绘图、处理事件,以及创建通用用户界面及其中元素。
UIKit框架还通过管理屏幕上显示的窗口、视图内容和控制触摸屏等事件,来组织应用程序。
框架的入口 #import <UIKit/UIKit.h>
当我们引入此头文件后,便可以在程序里使用任何在UIKit里声明的类。
UIKit框架是用在iOS平台上与之对应的是MAC OS X上的Application Kit,二者是姐妹框架,作用和目的相近。
我们同样可以借助一个图来进一步了解UIKit框架:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2BkhrtPE-1623204717592)(media/16226859611450/16227090241487.jpg)]
由上图可知,UIResponder类是图中最大分支的根类。
UIResponder为处理响应事件和响应链,定义了界面和默认行为。当用户用手指滚动列表或者在虚拟键盘上输入时,UIKit就生成时间传送给UIResponder响应链,直到链中有对象处理这个 事件。相应的核心对象,比如:UIApplication,UIWindow,UIView都直接或间接的从UIResponder继承。
应用程序可以通过三种方式使用UIKit创建界面
对于UIKit框架中的一些基本类的使用方法可以了解一下这篇文章
Objective-C语言有C++ Java等面向对象的特点。同时Objective-C的优点是它是动态语言的。动态能力有三种:
每个Objective-C对象都有一个隐藏的数据结构,这个数据结构是Objective-C对象的第一个成员变量,它就是isa指针。
isa指针指向一个类对象(class object。class object是占用内存空间的一个变量,这个对象在编译的时候编译器就生成了,专门来描述某个类的定义。),这个类对象包含了Objective-C 对象的一些信息(为了区分两个对象,把前面提到的对象叫Objective-C对象),包括Objective-C对象的方法调度表,实现了什么协议等。这些包含信息就是Objective-C动态能力的根源了。
Objective-C对象在编译器,只要满足无语法错误就可以编译通过。在运行期才真正确定某对象指针下的对象的具体类,从而通过具体类的isa指针动态找到方法调度表里面的方法(每个类的具体方法实现都有一个IMP指针)实现、协议等,去实现功能。
如果抛开NSObject对象的其他的成员数据和变量,NSObject可以看成这样:
@interface NSObject <NSObject> {
Class isa;
}
不考虑@interface关键字在编译时的作用,可以把NSObject更接近C语言结构表示为:
struct NSObject{
Class isa;
}
Class是用typedef 定义的: typedef struct objc_class *Class; ,那NSObject可以这么写了
struct NSObject{
objc_class *isa
}
那objc_class的结构是什么样的呢?大概是这样的:
struct objc_class {
Class isa;
Class super_class;
const char *name;
long version;
long info;
long instance_size;
struct objc_ivar_list *ivars;
struct objc_method_list **methodLists;
struct objc_cache *cache;
struct objc_protocol_list *protocols;
}
这里会看到,在这个结构体里还有一个isa指针,这里的isa指针指向的是元类对象(metaclass object)。
元类对象是用来存储的关于类的版本,名字,类方法等信息。
所有的元类对象(metaclass object)都指向 NSObject的元类对象,到头还是NSObject。一共三次:类对象->元类对象->NSObject元类对象。
为了得到整个类组织架构的信息,objc_class结构里定义了第二个成员变量Class super_class,它指向父类的类对象。可以通过下图来进一步理解:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HICEYQmW-1623204717592)(media/16226859611450/16227111458738.jpg)]
从上图中可以看出,D3继承D2,D2继承D1,D1最终继承NSObject。那么下图是从D3的一个对象开始,排列出D3 D2 D1 NSObject 类对象,元类对象等的关系,图中的箭头都是指针的指向:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mmRHTwJj-1623204717593)(media/16226859611450/16227112172500.png)]
NSObject是大部分Objective-C类的根类,它没有父类。
其它类继承NSObject,访问Objective-C运行时系统的基本接口,这样其他类的实例可以获得运行时的能力。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bUBroUyx-1623204717594)(media/16226859611450/16227113109713.jpg)]
对象的四种内存管理方式,如下图所示:
AirDrop
AirDrop允许用户与附近设备共享图片、文档、urls链接以及其它种类的数据。
Text Kit
TextKit是处理文本和排版的一个全功能、高级别的类集合。
使用Text Kit我们能在段落、列或者页上对带有风格的文本进行布局;
也能在任意区域(如图形)周围布局流动的文本;
还能用它来管理多种字体。
开发应用时应该首先考虑使用Text Kit来进行文本呈现,而不是Core Text。Text Kit与所有UIKit中的基于文本的控制集成允许应用更容易地创建、编辑、显示和存储文本。
UIKit Dynamics
UIKit dynamics用来为符合UIDynamicItem协议的UIView对象或其它对象规定动画行为。
通过在应用的UI中集成真实世界行为和特性进,动画行为为应用提供了一种增强用户体验的方式。
Multitasking
在iOS中多任务用来设计来使电池使用时间最大化。
Auto Layout
自动布局帮助我们使用非常少的代码来建立动态接口。
使用AutoLayout定义如何在用户接口上布局元素的规则,这些规则表达了视图类之间的关系,如规定一个按钮总是处于它的父窗口的左边缘20个点。
在Auto Layout中使用的实体是被称为constraints的Objective-C对象。
Storyboards
“故事板”是设计应用用户接口的推荐方式。
“故事板”让我们在一个地方就能够设计全部的用户接口,方便在一个位置看到所有的视图和视图控制器以及理解它们是如何一起工作的。
“故事板”的一个重要的部分是定义segues(segues是从一个视图控制器到另一个的转换)。
这些转换代表用户接口之间的交互。“故事板”可以使用XCOE来可视的定义这些转换或者通过编程启动它们。
我们能使用一个单“故事板”文件来存储所有的应用视图控制器和视图,
或者使用多个视图串联图文件来组织用户接口。
在应用建立时间,Xcode读取“故事板”文件的内容并把它分成多个能独立加载的离散的片断,以便获得更好的性能。
UIKit框架提供了相应的类来从程序中存取一个“故事板”的内容。
UI State Preservation
UI状态保存能够使应用表现的一直运行,从而为用户提供无缝的体验。
如果系统遇到内存压力,系统可能安静地强制停止一个或多个后台应用。
当应用从前台移到后台时,该服务能保存应用的视图和视图控制器的状态。
在下次应用重新启动时,能够使用先前保存的状态信息来恢复视图和视图控制器到它们先前的配置,使应用表现得好像一直在运行。
Apple Push Notification Service
苹果的推送通知服务提供了一种提示用户关于新信息的方式,即使应用当前不在激活运行状态。
使用该服务,你能推送文本通知,在应用图标上增加一个标记或者在任意时间触发声音提示。
这些消息让用户知道他们应该打开应用来接收相关信息。自iOS7开始,我们甚至能推送无声的通知来让应用知道有了新的内容可以下载。
为了使用IOS应用的推送通知,用户需要做两部分的工作:
第一、应用必须登记该通知服务以及在通知被提交时处理相关的通知数据。
第二、我们必须提供一个服务端的进程来产生通知。服务端的进程可以使用你自己的本地服务器或者使用苹果的推送通知服务。
Local Notifications
本地通知作为推送通知机制的补充,可以给应用提供一种不依赖外部服务器产生本地通知的方式。
运行在后头的应用能使用本地通知作为当重要的事件发生时引起用户注意的一种方式。例如,运行在后台的导航应用能使用本地通知来提示用户什么时间该转弯了。
应用也能调度本地通知在将来的时间提交以及使那些通知在应用不运行也能被提交。
本地通知的一个优点是它们与你的应用是独立的。
在一个通知已被调度,系统管理它的提交。另外当通知被提交时你的应用甚至不必运行。
Gesture Recognizers
手势识别用来检测通常类型的手势。
由于手势识别使用与系统检测手势相同的试探方法,因此手势识别为应用提供了一个一致的行为。
为了使用它,你能在你的视图上附加手势识别功能和并给它提供一个在手势出现时要执行的方法。
手势识别跟踪原始的触摸事件和确定它们什么时候与想要的手势匹配。
System View Controllers
许多系统框架为标准的系统接口定义了视图控制器。
只要有可能,为了呈现一致的用户体验,就应该使用系统提供的视图控制器而不是创建一个新的。
Address Book UI Framework(地址本UI框架)
该框架提供一个面向对象的编程接口。
用来显示标准的系统接口,来创建新的联系人和编辑和选择已存在的联系人。
Event Kit UI Framework(月历事件UI框架)
该框架提供一个视图控制器来呈现标准的系统接口,来观察和编辑月历相关的事件。
EventKit UI Framework基于Event Kit framework框架。
Game Kit Framework(游戏工具框架)
该框架实现对游戏中心的支持,让用户能够在线共享他们的游戏相关的信息。
iAd Framework(iAD框架)
该框架用来在应用中提供广告条。当我们想要显示广告时,广告条与用户UI上的标准的视图进行合并。
这些视图与苹果的iAd服务一起工作,自动处理、加载和呈现富媒体广告以及应答在那些广告条上的点击等所有相关的工作。
Map Kit Framework(地图工具框架)
MapKit提供与应用的UI组合的一个可滚动的地图。
除了显示一个地图,你能使用该框架接口来定制地图的内容和外观,也能使用注解来标记感兴趣的点,也能使用定制的内容来与地图内容叠置。
例如,你可以在地图上来画一条公交路线,或者使用注解来高亮显示附近的商店和餐馆。
除了显示地图,MapKit框架还能与地图应用以及苹果的地图服务器集成来为用户指引方向。
地图应用能够给任意支持方向的应用提供方向的代理。
如提供特定类型方向的应用,例如一个显示地铁路线的应用,能登记请求接收地图应用提供的方向。
应用也能向苹果的服务器请求步行或驾驶方向,并与他们定制的方向的路径信息混合来为用户提供完整的点到点体验。
Message UI Framework( 消息UI框架)
该框架用来在应用中提供编辑邮件和sms消息的支持。
编辑支持包括一个呈现到你的应用的视图控制器接口,并能设置这个视图控制器的一些区域,如接收人、主题、邮件主体和邮件想包括的任意附件。
在呈现视图控制器后,也能为用户提供一个在发送邮件之前可以编辑邮件的选项。
UIKit Framework
该框架提供实现图形和事件驱动的应用的至关重要的基础。包括:
图形技术
高质量的图形是所有应用的重要的组成部分。
iOS提供了许多帮助你定制艺术和图形屏幕的技术。
iOS图形技术为其提供了广泛的支持,并可以与UIKit视图架构无缝工作。
我们能使用标准的视图来快速提交高质量的接口,或者使用本层的图形技术创建我们自己的定制视图来提交一个更加丰富的图形体验。
声音技术
声音技术工作于底层硬件之上,为用户提供更加丰富的声音体验。
这些体验包括播放和记录高质量的声音、处理MIDI内容以及使用设备内建的声音等能力。
视频技术
视频技术提供管理应用中的静态视频内容或者播放来自Internet的视频流的支持。
对于带有适当的记录硬件的设备,该框架还能够记录视频以及与应用进行集成。
AirPlay技术
AirPlay让应用串流声音和视频内容到Apple TV或者串流声音内容到第三方扬声器和接收器。
AirPlay内建于许多框架,包括UIKit、Media Player、AVFoundation、Core Audio。
因此在大多数情况你不需要为了支持它做任何事。
在使用那些框架时,当播放内容时自动获得AirPlay支持。当用户选择使用AirPlay播放内容时系统自动进行路由。
Assets Library 框架
AssetsLibrary 框架(AssetsLibrary.framework)提供对用户设备上图片应用管理的图片和视频的存取。
使用该框架来存取用户保存的图片相册或导入到设备的任意相册中的图片,你也能保存新的图片和视频到用户的图片相册。
AV Foundation 框架
AVFoundation 框架 (AVFoundation.framework)提供一组播放、记录和管理声音和视频内容的Objective-C类。当你想在应用的ui接口无缝集成媒体能力时使用该框架。你也能使用它来进行更先进的媒体处理,例如同时播放多个声音或者控制播放和记录过程的多个方面。
该框架提供的服务包括:
Core Audio 框架
Core Audio是一个对声音处理提供本地支持的框架家族。
这些框架支持声音的产生、记录、混合和回放。你也能使用这些接口处理MIDI内容以及串流声音和MIDI内容到其它应用。
Core Audio框架包括如下框架:
Core Graphics 框架
CoreGraphics.framework包含Quartz 2D绘制api。
Quartz是一个原先用在OS X的先进的、向量绘制引擎。
Quartz支持路径绘制,抗锯齿呈现,剃度,图像,颜色,坐标空间转换以及pdf 内容创建、显示和分析等功能。
虽然这个api是C-based接口,但它使用了面向对象抽象来表现基本的绘制对象,因此使它容易存储和重用图形内容。
Core Image 框架
CoreImage 框架(CoreImage.framework)提供一组强大的内建过滤器来操作视频和静态图像。
我们能在触摸弹起、纠正图片以及面部和特征检测等许多方面使用这些内建的过滤器。
这些过滤器的先进特点是它们操作在非破坏方式,即原先的图像不被改变。
这些过滤器针对底层硬件进行了优化,因此它们是快速和有效的。
Core Text 框架
CoreText 框架 (CoreText.framework)提供一个对文本进行布局和字体处理的简单的、高性能的C-based接口。
该框架用在不使用TextKit但仍想获得在字处理应用中发现的先进文本处理能力。
该框架提供了一个智能的文本布局引擎,包括在其它内容周围环绕文本的能力,它也支持使用多种字体和呈现属性的先进的文本风格。
Core Video 框架
CoreVideo 框架 (CoreVideo.framework)为Core Media框架提供缓冲和缓冲池支持。多数应用从不直接使用该框架。
Game Controller 框架
GameController框架(GameController.framework)让你在应用中发现和配置针对iPhone/iPod/iPad设备的游戏控制器。
游戏控制器可以是物理连接到iOS设备或者是通过蓝牙无线连接。
GameController框架当控制器可获得时通知你的应用让应用可以规定哪个控制器输入与你的应用相关。
GLKit 框架
GLKit框架 (GLKit.framework)包含一组简化创建OpenGLES应用的Objective-C based 单元类。
GLKit支持应用开发的四个关键领域
Image I/O 框架
ImageI/O 框架(ImageIO.framework)提供输入和输出图像数据和图像元数据的接口。
该框架利用CoreGraphics数据类型和功能,并支持在iOS上所有的可获得的标准的图像类型。
我们能使用这个框架存取Exif和IPTC元数据属性。
Media Accessibility框架
MediaAccessibility 框架 (MediaAccessibility.framework)管理媒体文件中closed-caption内容的呈现。
该框架与新的设置配合工作可以让用户决定是否允许closed-caption显示。
Media Player 框架
MediaPlayer 框架(MediaPlayer.framework)提供应用中播放声音和视频的高级别支持。
能够使用该框架做如下工作:
OpenAL 框架
OpenAudio Library (OpenAL)接口是用来在应用中提供位置音效的跨平台的标准。
能够使用该接口在游戏和其它需要位置音效输出的程序中实现高性能、高质量的声音。
因为OpenAL是跨平台的标准,在iOS使用OpenAL编写的代码能够容易地移植到许多其它平台。
OpenGL ES 框架
OpenGLES 框架 (OpenGLES.framework)提供绘制2d和3d内容的工具, 它是一个C-based的框架。
该框架以最接近设备硬件的方式为全屏沉浸式应用例如游戏提供细粒度的图形控制和高的帧率。
我们能够与EAGL配合使用这个框架,为OpenGL ES 绘制调用和UIKit的本地窗口对象之间提供接口。
该框架支持OpenGLES 1.1, 2.0, 3.0规范。
2.0规范增加了片段和顶点着色的支持,3.0规范增加了更多的功能,包括多个呈现目标和变换反馈。
Quartz Core 框架
QuartzCore 框架(QuartzCore.framework)包含Core Animation接口。
Core Animation是一个先进的复合技术,使用它能容易创建快和有效的view-based的动画。
复合引擎利用底层硬件来有效的实时操作视图内容。
只需规定动画的起始点,CoreAnimation做剩下的工作。
因为Core Animation内嵌在UIView架构的底层,因此它总是可用的。
Sprite Kit 框架
SpriteKit 框架 (SpriteKit.framework)框架为2d和2.5d游戏提供硬件加速的动画系统。
SpriteKit提供大多数游戏需要的基础,包括一个图形引擎和动画系统,声音播放支持,一个物理仿真引擎。
使用SpriteKit不需你自己创建这些事情,使你聚焦在内容设计和内容的高级别的交互上。
在Sprite Kit应用中内容组织为场景。
一个场景包括纹理对象,视频,路径图形,核心图像过滤器和其它的特效。
SpriteKit利用这些对象,确定这些对象到屏幕上的最有效的方式。
当在场景中到了动画内容的时刻,你能使用SpriteKit来显式规定你想执行的行动或使用物理仿真引擎来为那些对象定义物理行为(例如重力、引力或排拆力)。
除了SpriteKit框架,也有其它Xcode工具来创建颗粒发射效果和纹理图。
我们能使用Xcode工具来管理应用资源和快速地更新Sprite Kit场景。
Peer-to-Peer Services(点到点服务)
这个Multipeer Connectivity框架提供通过蓝牙进行p2p连接的能力。
你能使用p2p连接来启动与附近设备的通讯会话。
虽然p2p连接主要用在游戏中,你也能在其它类型的应用中使用这个功能。
iCloud Storage(云存储)
iCloud存储让应用把用户文档和数据写到一个中心位置,用户然后能从他们的计算机和iOS设备存取这些数据。
使用iCloud可以使用户文档无所不在,意味着用户能从任何设备阅读或编辑那些文档,而不需要显式的同步或文件传输。
存储文档到用户的iCloud账户也为用户提供了一层安全。
即使用户的设备丢失,那些设备上的文档如果已经保存到iCloud就不会丢失。
应用能以两种方式使用 iCloud存储,每一种有不同的使用意图:
Automatic Reference Counting(自动引用计数)
AutomaticReference Counting(ARC)是一个编译级别的功能,用它来简化Objective-C对象生命周期过程的管理,以此代替用户必须记住什么时候应该保持和释放对象。
ARC评估对象的生命周期需求和自动在编译时间插入适当的方法调用。
ARC用来代替iOS的早期版本中存在的传统的管理内存的编程模式。
新创建的工程自动使用ARC。Xcode也提供了移植工具帮助我们转换遗留的工程来使用ARC.
Block Objects(块对象)
BlockObjects是一个能够与你的C或Objective-C代码集成的C语言的构造块。
一个blockobject本质上是一个异步功能和相关的数据。
在其它语言中有时也被称做closure或lambda。
Blocks尤其用作回调或放在你需要一种容易的组合执行代码和相关数据方式的地方。
在iOS,通常在下面的场景使用Blocks:
Data Protection(数据保护)
DataProtection允许应用利用设备上已有的内建的加密方法来使用用户的敏感数据。
当应用指定一个特定的文件被保护时,系统在磁盘上以加密格式存储该文件。
当设备锁定时,该文件的内容不能被应用和任何潜在的侵入者存取。
可是当设备由用户解锁时,一个解密key被创建允许你的应用存取那个文件。
用户也可以使用其它级别的数据保护机制。
实现数据保护需要你考虑如何创建和管理你想保护的数据。
应用必须设计在数据的创建时间加密数据,以及当用户锁定或解锁设备时为存取条件改变做好准备。
File-Sharing Support(文件共享支持)
File-SharingSupport使用户数据文件在iTunes 9.1和以后上可被其它应用获得。
一个应用声明支持文件共享使它的/Documents目录下的内容对其它用户可获得。
用户然后当需要时能够把文件从iTunes移进或移出应用的Documents目录。
这个特征不允许应用与相同设备上的其它应用共享应用,这需要粘贴板或一个文档交互控制器对象。
应用为了允许文件共享支持,需要做如下工作:
Grand Central Dispatch
GrandCentral Dispatch(GCD)是一个BSD技术,应用可以用来管理其任务的执行。
GCD与高优化的核组合成一个异步编程模式,来提供方便和更有效的对线程的替代。
GCD也为许多低级别的任务提供一个方便的选择,例如读和写文件描述符,实现定时器和监视信号和处理事件。
In-App Purchase(应用内购买)
In-App Purchase 提供在应用中销售应用特定的内容和服务以及来自iTunes的内容的能力。
这个功能使用StoreKit框架实现,并提供使用用户的iTunes账号来处理金融方面的事务需要的基础。
应用处理全部用户体验和供购买的内容及可获得服务的呈现。
作为可下载的内容,你能把可下载的内容放到你自己的服务器或使用苹果的服务器。
SQLite
SQLite库让你在你的应用中嵌入一个轻量级的sql数据库,而不需要运行一个分离的远程数据库服务进程。
从你的应用,你能创建本地数据库文件,管理数据库表和表中的数据记录。
SQLite库为通用功能使用设计,但已经被优化来提供对数据记录更快速的存取。
XML Support
Foundation框架提供一个NSXMLParser类用来从一个xml文档中引出元素。
操作xml内容的额外的支持由libxml2库提供支持。
libxml2开源库让你快速地分析或写任意的xml数据和转换xml内容到html。
Accelerate 加速框架
Accelerate框架 (Accelerate.framework)包含执行数字信号处理、线性代数、图像处理计算的接口。
使用该框架的优点是它们针对所有的iOS设备上存在的硬件配置做了优化,因此你能写一次代码确保在所有设备上有效运行。
Core Bluetooth Framework(核心蓝牙框架)
CoreBluetooth 框架 (CoreBluetooth.framework)允许开发者与蓝牙低耗电外设(LE)交互。
使用该框架的Objective-C接口能够完成如下工作:
External Accessory Framework(外部附件框架)
ExternalAccessory 框架(ExternalAccessory.framework)提供与连接到IOS设备的硬件附件通讯的支持。
附件能通过30-pin连接器或使用蓝牙无线与iOS设备进行连接。
该框架给我们提供了获得关于每一个可获得的附件信息和启动通讯会话的方式。
然后,我们可自由的使用附件支持的命令直接操作附件。
Generic Security Services Framework(通用安全服务框架)
GenericSecurity Services 框架 (GSS.framework)给ios应用提供一组标准安全相关的服务。
该框架的基本接口规定在IETFRFC2743 andRFC4401。
除了提供标准的接口,iOS还包括一些没有在标准中规定但被许多应用需要的一些管理证书需要的额外东西。
Security Framework(安全框架)
除了内建的安全功能,iOS也提供了一个明确的安全框架(Security.framework),你能用它来保证应用管理的数据的安全。
该框架提供管理证书、公有和私有key和信任策略的接口,支持产生加密安全伪随机码。
它也支持在keychain(保存敏感用户数据的安全仓库)中保存证书和加密key。
公共加密库提供对称加密、hash认证编码(HMACs)、数字签名等额外支持,数字签名功能本质上与iOS上没有的OpenSSL库兼容。
在我们创建的多个应用之间共享keychain是可能的。
共享使它容易在相同的一套应用之间更平滑的协作。
例如,你能使用该功能来共享用户口令或其它元素,否则可能使每个应用都需要提示用户。
为了在应用之间共享数据,必须为每个应用的Xcode工程配置适当的权限。
System
System级包含kernel环境、驱动以及操作系统级别的unix接口。
kernel本身负责操作系统的每一个方面:如虚拟内存管理、线程、文件系统、网络和互联通信。
在该层的驱动也提供在可获得的硬件与系统框架之间的接口。
为了安全,对kernel和驱动的存取被限制到一组有限的系统框架和应用。
iOS提供一组存取许多操作系统低级别功能的接口。
应用通过LibSystem库存取这些功能。
该C based的接口提供如下功能的支持:
64-Bit Support
iOS原先是为32-bit架构的设备设计的。
自iOS 7,开始支持在64-bit进行编译、链接和调试。
所有的系统库和框架是支持64位的,意味着它们能在32-bit和64-bit应用中使用。
当以64-bit运行时编译时,应用可能运行的更快,因为在64-bit模式可以获得额外的处理器资源。
iOS使用OS X和其它64-bitUNIX系统使用的LP64模式,意味着在这些系统移植时不会碰到太头疼的事。