整理自:IOS 整体框架类图值得收藏
一 整体框架
在iOS开发过程中,对iOS整体框架的了解和学习是必不可少的一个环节,今天我们就好好来了解一下iOS的整体框架。首先贴一个关于iOS的框架介绍:iOS系统框架概述。我们通常称呼iOS的框架为Cocoa Touch框架,Cocoa Touch是一个框架的集合,里面包含了众多的子框架。每一个子框架都是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像、声音文件等其他资源,共享资源库定义应用程序可以调用的函数和方法。框架中的类相互依赖构成一个整体,提供完善的某一方面的服务或解决方案,多个框架一起实现整个应用程序的结构。由于应用程序的结构是通用的,开发者通过框架提供的函数和方法,做细致个性化的处理,从而满足不同应用的不同需求。开发一个应用程序就是将需求细致化的代码插入到框架提供的设计中来组合成一个整体完成最终的应用设计。
1.1 iOS系统架构
iOS的整体系统框架图如下图所示,iOS的系统架构主要由Application Layer(应用层)、Cocoa Touch Layer(触摸层)、Media Layer (媒体层)、Core Services Layer(核心服务层)、Core OS Layer (核心系统操作层)和The Kernel and Device Drivers layer(内核和驱动层)。
了解了系统架构,那么每一层的主要功能是什么呢?下图就是iOS8.3系统的框架架构图,最新的图没有找到,现在iOS11中新增了一些功能模块,但是整体的框架大同小异。
- Cocoa Touch Layer:触摸层提供应用基础的关键技术支持和应用的外观。如NotificationCenter的本地通知和远程推送服务,iAd广告框架,GameKit游戏工具框架,消息UI框架,图片UI框架,地图框架,连接手表框架,UIKit框架、自动适配等等
-
Media Layer:媒体层提供应用中视听方面的技术,如图形图像相关的CoreGraphics,CoreImage,GLKit,OpenGL ES,CoreText,ImageIO等等。声音技术相关的CoreAudio,OpenAL,AVFoundation,视频相关的CoreMedia,Media Player框架,音视频传输的AirPlay框架等等
-
Core Services Layer:系统服务层提供给应用所需要的基础的系统服务。如Accounts账户框架,广告框架,数据存储框架,网络连接框架,地理位置框架,运动框架等等。这些服务中的最核心的是CoreFoundation和Foundation框架,定义了所有应用使用的数据类型。CoreFoundation是基于C的一组接口,Foundation是对CoreFoundation的OC封装
-
Core OS Layer:系统核心层包含大多数低级别接近硬件的功能,它所包含的框架常常被其它框架所使用。Accelerate框架包含数字信号,线性代数,图像处理的接口。针对所有的iOS设备硬件之间的差异做优化,保证写一次代码在所有iOS设备上高效运行。CoreBluetooth框架利用蓝牙和外设交互,包括扫描连接蓝牙设备,保存连接状态,断开连接,获取外设的数据或者给外设传输数据等等。Security框架提供管理证书,公钥和私钥信任策略,keychain,hash认证数字签名等等与安全相关的解决方案。
上面的每一模块只是简单滴介绍了大致功能,更多详细信息大家可以 戳这里看大神的博客了解更多:iOS总体框架介绍和详尽说明。显然,在上面所有的框架中,最重要也最经常使用的就是UIKit和Foundation框架,在本文的第二部分我们将详细介绍这两部分中的类继承体系。
1.2 官方文档
官方文档戳这里!!,解释一下,官方文档中将OS体系分为四层,如下图所示,没有Cocoa Touch Layer和Application Layer,取而代之的是Cocoa (Application) Layer。我们再细看官网的对Cocoa (Application) Layer的官方解释如下,说的是该层是为创建App提供了用户界面基础,响应用户事件,并且可以管理App的行为。这其实就是Cocoa Touch Layer(触摸层,UIKit)的作用,只是官网省略了Application Layer(应用层),因为这一层主要就是app了,主要由开发人员完成。其他的资料大家自行根据官方文档查看,在这里就不过多进行解读和分析了。
-
The Cocoa (Application) layer includes technologies for building an app’s user interface, for responding to user events, and for managing app behavior.
二 Cocoa框架的类继承体系
Cocoa框架是iOS应用程序的基础,是OS X和 iOS操作系统的程序的运行环境,了解Cocoa框架,对开发iOS应用有很大的帮助。iOS中,Cocoa众多框架中最重要最基本的两个框架是:Foundation 和 UIKit。这两个框架基本包含了iOS、OS X开发过程中要用到的绝大多数OC类,因此这两个框架是Cocoa框架其中Foundation 和界面无关,也可以说和界面无关的类基本是Foundation框架的,和界面相关的是UIKit框架。这两个框架在系统中处于的位置如图:
之前在学习Java和Android时,Java和Android提供了非常详尽的系统框架,并在API的索引中中对Java和Android的类继承体系和分类都非常明晰,而在iOS开发过程中,API中类的聚合是按照功能和作用划分模块,对iOS中的类继承体系没有一个明确的介绍。而类继承体系的了解有助于我们对iOS系统的整个模块的体系框架有一个更为清晰的了解和认识,对对应类继承体系中的类的特性和常规用法都有一个大致的认识和了解。因此,这两天得闲就对这一块进行整理和学习,对Cocoa框架中的最重要的Foundation 和 UIKit框架中的类继承体系进行了梳理。
2.1 Foundation框架类继承体系
Foundation框架为所有应用程序提供基本的系统服务。应用程序以及 UIKit和其他框架,都是建立在 Foundation 框架的基础结构之上。 Foundation框架提供许多基本的对象类和数据类型,使其成为应用程序开发的基础。它还制定了一些约定(如用于取消分配等任务),使代码更加一致,可复用性更好。
话不多说,我们先来看看Foundation框架,三个图,包括了Foundation所以的类,图中灰色的是iOS不支持的,灰色部分是OS X系统的。
将上图Foundation框架中的类进行逻辑分类如下:
- 值对象
- 集合
- 操作系统服务 包括下面三个
- 文件系统和URL
- 进程间通讯。 这个范畴中的大部分类代表不同的系统端口、套接字、和名字服务器,对实现底层的IPC很有用。NSPipe代表一个BSD管道,即一种进程间的单向通讯通道。
- 线程和子任务。 NSThread类使您可以创建多线程的程序,而各种锁(lock)类则为彼此竞争的线程在访问进程资源时提供各种控制机制。通过NSTask,您的程序可以分出一个子进程来执行其它工作或进行进度监控。
- 通知
- 归档和序列化
- 表达式和条件判断
- Objective-C语言服务
对于Foundation框架中的一些基本类的使用方法详情参见:iOS开发系列—Objective-C之Foundation框架
2.2 UIKit框架类继承体系
- (PS1: 可以认为是操纵界面的一个API库)
- (PS2: UIKit框架是用在iOS平台上与之对应的是MAC OS X上的Application Kit,二者是姐妹框架,作用和目的没啥太大区别(我没有说实现目的的过程也一样),表混淆了)
- 在用户界面工具(interface Buidler)从对象库里 拖拽窗口,视图或者其他的对象使用。
- 用代码创建
- 通过继承UIView类或间接继承UIView类实现自定义用户界面
同样的, UIKitk框架的类继承体系图如下图所示:
在图中可以看出,responder 类是图中最大分支的根类,UIResponder为处理响应事件和响应链 定义了界面和默认行为。当用户用手指滚动列表或者在虚拟键盘上输入时,UIKit就生成时间传送给UIResponder响应链,直到链中有对象处理这个 事件。相应的核心对象,比如:UIApplication ,UIWindow,UIView都直接或间接的从UIResponder继承 。UIKit框架的各个类的简单介绍戳后面的链接:UIKit框架各个类的简要说明
三 Cocoa对象
此处内容全部来源于: IOS 整体框架类图值得收藏
3.1 Objective-C是面向对象的语言
Objective-C和Java C++一样,有封装,继承,多态,重用。但是它不像C++那样有重载操作法、模版和多继承,也没有Java的垃圾回收机制。
3.2 Objective-C的优点
Objective-C语言有C++ Java等面向对象的特点,那是远远不能体现它的优点的。Objective-C的优点是它是动态的。动态能力有三种:
- 动态类——运行时确定类的对象
- 动态绑定——运行时确定要调用的方法
- 动态加载——运行时为程序加载新的模块
3.3 动态能力相关的isa指针
每个Objective-C对象都有一个隐藏的数据结构,这个数据结构是Objective-C对象的第一个成员变量,它就是isa指针。这个指针指向哪 呢?它指向一个类对象(class object 记住它是个对象,是占用内存空间的一个变量,这个对象在编译的时候编译器就生成了,专门来描述某个类的定义),这个类对象包含了Objective-C 对象的一些信息(为了区分两个对象,我把前面提到的对象叫Objective-C对象),包括Objective-C对象的方法调度表,实现了什么协议等 等。这个包含信息就是Objective-C动态能力的根源了。那我们看看isa指针类型的数据结构是什么样的?
如果抛开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指针,又是一重指向,是不是有种到了盗梦空间的感觉。不用紧张,take easy,不会有那么多层次的,这里的isa指针指向的是元类对象(metaclass object),带有元字,证明快到头了。那元对象有啥用呢?它用来存储的关于类的版本,名字,类方法等信息。所有的元类对象(metaclass object)都指向 NSObject的元类对象,到头还是NSObject。一共三次:类对象->元类对象->NSObject元类对象。
为了得到整个类组织架构的信息,objc_class结构里定义了第二个成员变量Class super_class,它指向父类的类对象。说了这么多,可能关系缕不清楚,有道是一张图胜过千言万语
从上图中可以看出,D3继承D2,D2继承D1,D1最终继承NSObject。那么下图是从D3的一个对象开始,排列出D3 D2 D1 NSObject 类对象,元类对象等的关系,图中的箭头都是指针的指向。
3.4 根类 NSObject
NSObject是大部分Objective-C类的根类,它没有父类。其它类继承NSObject,访问Objective-C运行时系统的基本接口,这样其他类的实例可以获得运行时的能力。
- 根类和根类协议:NSObject不但是个类名,NSObject也是个协议的名称,参考NSObject协议 , NSObject协议指定了根类必须实现的接口。
- 根类的主要方法:分配、初始化、复制
- 分配:alloc和allocWithZone:方法用于从某内存区域中分配一个对象内存,并使对象指向其运行时的类定义。
- 初始化:init方法是对象初始化。
- new是一个将简单的内存分配和初始化结合起来的方法。
- 复制:copy和copyWithZone
- 对象的保持和清理:
- retain方法增加对象的保持次数。
- release方法减少对象的保持次数。
- autorelease方法也是减少对象的保持次数,但是以推迟的方式。
- retainCount方法返回对当前的保持次数。
- dealloc方法由需要释放对象的实例变量以及释放动态分配的内存的类实现。
- NSObjec有很多方法可以查询对象的运行时信息。这些内省方法有助于找出对象在类层次中的位置,确定对象是否实现特定的方法,以及测试对象是否遵循某种协议。下面是部分方法
- superclass和class方法(实现为类和实例方法)分别以Class对象的形式返回接收者的父类和类。
- isKindOfClass:和isMemberOfClass:方法来确定对象属于哪个类。后者用于测试接收者是否为指定类的实例。isSubclassOfClass:类方法则用于测试类的继承性。
- respondsToSelector:方法用于测试接收者是否实现由选择器参数标识的方法。instancesRespondToSelector:类方法则用于测试给定类的实例是否实现指定的方法。
- conformsToProtocol:方法用于测试接收者(对象或类)是否遵循给定的协议。
- isEqual:和hash方法用于对象的比较。
- description方法允许对象返回一个内容描述字符串;这个方法的输出经常用于调试(“print object”命令),以及在格式化字符串中和“%@”指示符一起表示对象。
- 对象的编码和解码,下面的方法和对象的编解码(作为归档过程的一部分)有关:
- encodeWithCoder:和initWithCoder:是NSCoding协议仅有的方法。前者使对象可以对其实例变量进行编码,后者则使对象可以根据解码过的实例变量对自身进行初始化。
- NSObject类中声明了一些于对象编码有关的方法:classForCoder:、replacementObjectForCoder:、和awakeAfterUsingCoder:。
- 消息的转发
- forwardInvocation:允许一个对象将消息转发给另一个对象。
- 消息的派发
- 在performSelector开头的一些方法允许你延迟后派发指定消息,而且可以将消息(同步或异步的消息)从辅助线程派发到主线程。