整理自: IOS 整体框架类图值得收藏
在 iOS 开发过程中,对 iOS 的整理框架的了解和学习是必不可少的一个环节,今天我们就好好来了解一下 iOS 的整体框架。首先贴一个关于 iOS 的框架介绍: iOS 系统框架概述 。我们通常称呼 iOS 的框架为 Cocoa Touch 框架,Cocoa Touch 是一个框架的集合,里面包含了众多的子框架。每一个子框架都是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像、声音文件等其他资源,共享资源库定义应用程序可以调用的函数和方法。框架中的类相互依赖构成一个整体,提供完善的某一方面的服务或解决方案,多个框架一起实现整个应用程序的结构。由于应用程序的结构是通用的,开发者通过框架提供的函数和方法,做细致个性化的处理,从而满足不同应用的不同需求。开发一个应用程序就是将需求细致化的代码插入到框架提供的设计中来组合成一个整体完成最终的应用设计。
iOS 的整体系统框架图如下图所示,iOS 的系统架构主要由 Application Layer(应用层)、Cocoa Touch Layer(触摸层)、Media Layer (媒体层)、Core Services Layer(核心服务层)、Core OS Layer (核心系统操作层)和 The Kernel and Device Drivers layer(内核和驱动层)。
了解额系统架构,那么每一层的主要功能是什么呢?下图就是 iOS8.3 系统的框架架构图,最新的图没有找到,现在 iOS11 中新增了一些功能模块,但是整体的框架大同小异。
上面的每一模块只是简单滴介绍了大致功能,更多详细信息大家可以 戳这里看大神的博客了解更多: iOS 总体框架介绍和详尽说明 。显然,在上面所有的框架中,最重要也最经常使用的就是 UIKit 和 Foundation 框架,在本文的第二部分我们将详细介绍这两部分中的类继承体系。
官方文档戳这里!! ,解释一下,官方文档中将 OS 体系分为四层,如下图所示,没有 Cocoa Touch Layer 和 Application Layer,取而代之的是 Cocoa (Application) Layer。我们再细看官网的对 Cocoa (Application) Layer 的官方解释如下,说的是该层是为创建 App 提供了用户界面基础,响应用户事件,并且可以管理 App 的行为。这其实就是 Cocoa Touch Layer(触摸层,UIKit)的作用,只是官网省略了 Application Layer(应用层),因为这一层主要就是 app 了,主要由开发人员完成。其他的资料大家自行根据官方文档查看,在这里就不过多进行解读和分析了。
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 框架中的类继承体系进行了梳理。
话不多说,我们先来看看 Foundation 框架,三个图,包括了 Foundation 所以的类,图中灰色的是 iOS 不支持的,灰色部分是 OS X 系统的。
将上图 Foundation 框架中的类进行逻辑分类如下:
对于 Foundation 框架中的一些基本类的使用方法详情参见: iOS 开发系列—Objective-C 之 Foundation 框架
UIKitk 框架提供一系列的 Class(类)来建立和管理 iOS 应用程序的用户界面 (UI) 接口、应用程序对象、事件控制、绘图模型、窗口、视图和用于控制触摸屏等的接口。框架的入口: #import <UIKit/UIKit.h> ,当引入此头文件后,便可以在程序里使用任何在 UIKit 里声明的类。(PS: 当然还要把这个框架链接到你的应用程序中)。
应用程序可以通过三种方式使用 UIKit 创建界面:
同样的, UIKitk 框架的类继承体系图如下图所示:
在图中可以看出,responder 类是图中最大分支的根类,UIResponder 为处理响应事件和响应链 定义了界面和默认行为。当用户用手指滚动列表或者在虚拟键盘上输入时,UIKit 就生成时间传送给 UIResponder 响应链,直到链中有对象处理这个 事件。相应的核心对象,比如:UIApplication ,UIWindow,UIView 都直接或间接的从 UIResponder 继承 。UIKit 框架的各个类的简单介绍戳后面的链接: UIKit 框架各个类的简要说明
Objective-C 和 Java C++ 一样,有封装,继承,多态,重用。但是它不像 C++ 那样有重载操作法、模版和多继承,也没有 Java 的垃圾回收机制。
Objective-C 语言有 C++ Java 等面向对象的特点,那是远远不能体现它的优点的。Objective-C 的优点是它是动态的。动态能力有三种:
每个 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 类对象,元类对象等的关系,图中的箭头都是指针的指向。
NSObject 是大部分 Objective-C 类的根类,它没有父类。其它类继承 NSObject,访问 Objective-C 运行时系统的基本接口,这样其他类的实例可以获得运行时的能力。
来源: https://www.cnblogs.com/mukekeheart/p/8203025.html