iOS 开发 Runtime到底是什么?

来源:互联网 发布:java面试宝典2015版 编辑:程序博客网 时间:2024/06/10 07:17

Runtime到底是什么?

这个问题一直以来都困扰着大家的,做iOS开发,天天和Object-c打交道,却对runtime到底是什么感觉到很费解?

  • 那么我们就先了解熟悉的东西:Object-C

    • 做iOS开发做的最基本的操作:类,对象,属性,方法,—无论你做什么功能都离开这四个最基本的东东,包括网络请求,代理协议,通知,block,多线程,KVC/KVO,内存管理等等.都是用哪个类创建哪个对象,修改类的属性,对象的属性值,用类或者对象调用哪个方法实现哪些功能和需求.难道不是这样吗?

    • Objective-C是基于C语言加入了面向对象特性和动态运行时的功能,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和转发。

因此我们就抓住了Runtime的核心:

  • 类,
  • 对象,
  • 属性,
  • 方法.

那么就让我们来认识认识苹果官方开源的Runtime,

官方开源的Runtime

这里写图片描述
这里写图片描述

markgc特别显眼, 已经被ARC代替了, 基本只有占坑作用. 其中核心内容在runtime/下, 上面是核心runtime列表, 通过文件名可以看出objc-runtime到底提供了哪些内容, objc_object(id), class, protocol, method, selector, weak, sync, selector-table, RC, load, exception, cache(用于class的selector快速访问), message, 以及几个LLVM提供的基础map, 还有objc中Root Class NSObject的实现(其实就是和runtime做对接, 把自己连入runtime, 这样继承的子类就自动接入runtime了), 以及没有单独实现的autoreleasepool(在NSObject中实现)

这里写图片描述

其中Messengers就是objc runtime中消息转发的核心了, 纯汇编写成

打开objc.xcodeproj工程文件

objc.xcodeproj

objc的runtime明确的实体就是一个叫做libobjc.dylib的一个编译产物

这里写图片描述

runtime.h

这里写图片描述
这里写图片描述
这里写图片描述

  • 苹果一贯的习惯,最重要的东西都写在最前面.

  • 因此我们就寻找到了理解runtime的突破点:类,对象,属性,方法—-

  • 都是满满的结构体啊,满满的结构体啊,满满的结构体啊,重要的事情说三遍

Runtime(运行时机制)理解

  • runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API。

  • 平时编写的OC代码, 在程序运行过程中, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者

  • Objective-C需要Runtime系统来动态创建类和对象,进行消息发送和转发。

runtime的作用

runtime是属于OC的底层, 可以进行一些非常底层的操作(用OC是无法现实的, 不好实现)。

1.在程序运行过程中, 动态创建一个类(比如KVO的底层实现)

 2.在程序运行过程中, 动态地为某个类添加属性\方法, 修改属性值\方法
 3.遍历一个类的所有成员变量(属性)\所有方法

点开这里看看Runtime的开发中的使用 iOS 开发 Runtime 运行时机制 完全解读

未完待续

后面的文章将会陆陆续续介绍Runtime中对于类,对象,消息机制的深入研究,KVC/KVO属性操作的底层原理

0 0
原创粉丝点击