runtime是一个很有意思的东西,如果你学iOS开发很经常就会用到或被问到runtime。那么runtime是什么呢,如何去了解它。

runtime:中文名 运行时,系统在编译时留下的一些 类型,操作在运行的时候动态去分析,处理,这也说明了object-c是一个动态语言。(swift与之不同,swift虽然可以通过调用oc的runtime,但是swift本身是静态语言。但是却通过能够和oc交互变成了具有动态特性的静态语言,这是闲话,不扯了)。

要了解runtime,知道runtime是什么。我觉得最关键的是看 objc/objc.h,objc/runtime.h文件。

首先要知道object-c底层是用c,c++写的

A. objc.h:

1、objc.h文件里面定义了一个id 是一个objc_object结构体指针类型,结构体中又一个isa这样的成员,isa是一个Class类型。而Class是 objc_class * 类型

也就是说一个 oc中的object其实就是一个带有objc_class*成员,并由这个objc_class*类型的成员来解释这个object是什么东西,包括这个object是什么类型,有什么方法。方法参数组成,有什么协议,类别等。

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #a5b0bb }
span.s1 { color: #de38a5 }
span.s2 { }

typedef struct objc_class *Class;

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #a5b0bb }
span.s1 { color: #de38a5 }
span.s2 { }

struct objc_object {

Class isa  OBJC_ISA_AVAILABILITY;

};

2、然后我们来看 Class这个类型,Class这个类型是objc_class*的别名。具体意思不就是说是用objc_class这个结构体对应的指针类型。

3、接着是SEL, 跟Class差不多这个也是另外一个结构体指针的别名,这个对应的结构体叫做objc_selector.

其中objc_object可以在runtime中看到具体的结构。objc_selector我没找到在哪里,谁看到了提醒一下哦。

4、然后是方法实现的定义:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #4bd156 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #eb905a }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #de38a5 }
span.s1 { }
span.s2 { color: #a5b0bb }
span.s3 { color: #8d8d8d }

/// A pointer to the function of a method implementation.

#if !OBJC_OLD_DISPATCH_PROTOTYPES

typedef void (*IMP)(void /* id, SEL, ... */ );

#else

typedef id (*IMP)(id, SEL, ...);

#endif

接着下面是定义了一些对方法名,变量的一些操作。

B.runtime.h

runtime.h文件中定义了很多的结构体和方法。

1、首先是给几个结构体指针类型定义了几个别名 objc_method * 对应Method, objc_ivar *对应Ivar,objc_catagory *对应 Catagory objc_property *对应objc_property_t 类型。

2、objc_class 结构体

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #a5b0bb }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #a5b0bb; min-height: 16.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #eb905a }
span.s1 { color: #de38a5 }
span.s2 { }

struct objc_class {

Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__

Class super_class                                        OBJC2_UNAVAILABLE;

const char *name                                         OBJC2_UNAVAILABLE;

long version                                             OBJC2_UNAVAILABLE;

long info                                                OBJC2_UNAVAILABLE;

long instance_size                                       OBJC2_UNAVAILABLE;

struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;

struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;

struct objc_cache *cache                                 OBJC2_UNAVAILABLE;

struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;

#endif

} OBJC2_UNAVAILABLE;

从上面这个结构中可以看到一个objc_class中有一个 Class 定义的isa成员,这个成员其实在A中可以看出来 其实也是一个objc_class *这种类型。(这种定义方式在我们学习c++的时候有学过。谭浩强的《面向对象c++》..)

然后我们这时要知道object-c里面的类和实例其实都是一个定义的对象,而且对应的指针是isa .也就是说系统 像malloc这个操作后会把 指针存到这个 isa中。

这样其实object-c里面的类和对象其实都是通过结构体指针来实现的。

然后我们再看 objc_class中的结构其中包括了 父类,类名,版本, 示例大小,实例中包含的变量列表,方法列表,缓存,协议列表。这些东西

在往下看 可以看到Protocol是一个objc_object类型,然后通过objc_object里面的isa 指针保存对应的名字,方法,变量等。所以通过这个你可以认识到定义一个协议是可以往里面加你要的属性的。

然后往下

objc_method_description的结构体这个东西定义了方法有方法名和方法类型

objc_property_attribute_t这个结构体定义了属性的特点包括需要有 名称 和 值。

再往下看有很多对实例在运行时的操作,这里我就省略了。又一个方法叫

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #a5b0bb }
span.s1 { }

imp_implementationWithBlock

从这里可以拿到一个block的对应的实现的指针。(block是一个对象)

再往下有给object设置关联的方法,这些操作就是平时用到的在类别中如何给一个类添加一些属性(类别中是不能添加属性的,不过通过这个方法可以为你定义的属性的set,和get方法相当于重写的操作。然后实现了一个类别的属性)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #a5b0bb }
span.s1 { }

objc_setAssociatedObject

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #a5b0bb }
span.s1 { }

objc_getAssociatedObject

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #a5b0bb }
span.s1 { }

objc_removeAssociatedObjects

再往下走又是一堆结构体 protocol_list, objc_catagory, objc_ivar, objc_ivar_list, objc_method, objc_method_list, objc_cache, objc_module.

这些结构体分别对应的定义了我们在oc中经常用到的 类别,方法等东西的结构(含糊的讲一下,有点多)

总结一下,也就是说其实ios的runtime是通过很多个 struct类型来缓存对应的结构并在运行的时候通过这些结构特征和对应的指针来分析并进行对应的操作。

所以多看里面的结构组成就对了。

以上属于个人理解

推荐一篇讲的蛮详细的(http://chun.tips/blog/2014/11/06/bao-gen-wen-di-objective[nil]c-runtime(3)[nil]-xiao-xi-he-category/

如果想更深入了解具体内部实现原理,就要看opensource.apple.com里面的内容了,如: https://opensource.apple.com//source/objc4/objc4-706/runtime/

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #a5b0bb }
span.s1 { }

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #a5b0bb }
span.s1 { color: #de38a5 }
span.s2 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #4bd156 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #a5b0bb }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #a5b0bb; min-height: 16.0px }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #eb905a }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #8d8d8d }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #de38a5 }
span.s1 { }
span.s2 { color: #de38a5 }
span.s3 { color: #a5b0bb }
span.Apple-tab-span { white-space: pre }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #a5b0bb }
span.s1 { }

最新文章

  1. Java笔记:有啥记啥
  2. HTML 学习笔记(URL)
  3. 【转】css布局居中和CSS内容居中区别和对应DIV CSS代码
  4. update 多表
  5. Python 中的函数与类的方法
  6. Configure,make,make install详解
  7. DATEDIFF()(转)
  8. hdu 5441 Travel(并查集)
  9. document.body的一些用法以及js中的常见问题
  10. java 8 Hashmap深入解析 —— put get 方法源码
  11. Image和字节数组互转
  12. CentOS克隆机器步骤,图文教程
  13. 如何成为快手尬舞王?HUAWEI HiAI了解一下!
  14. Codeforces 513D2 Constrained Tree
  15. HDU - 1542 Atlantis(线段树求面积并)
  16. Android 隐藏系统状态栏
  17. 使用scrapy入门教程
  18. nodejs从http升级到https(阿里云证书的使用)
  19. link标签链接CSS和@import加载的区别
  20. pa sslvpn使用手册

热门文章

  1. 如何利用Oracle外部表导入文本文件的数据
  2. C++ 连接数据库的入口和获取列数、数据
  3. 编译器出现conflicting types for 某某的错误原因总结
  4. ubuntu super daemon设置
  5. Oracle数据库资源管理
  6. 探秘Tomcat——从一个简陋的Web服务器开始
  7. FreeMarker模板开发指南知识点梳理
  8. NET开发学习项目资源(2)
  9. 代码片段添加智能提示,打造一款人见人爱的ORM框架
  10. xhtmlConformance与xhtml脚本呈现