runtime 学习笔记(一)

概述

     OC正是由于有了runtime才使得c语言具有了面向对象的能力,在程序的运行时刻,创建,检查,修改类、对象以及类、对象的方法。

    为什么会这么说?OC中的对象、类又到底是一个什么样的数据结构,对象、类又是如何用C来描述的呢?带着这样的问题,我们首先来看一下在OC中类的定义。

Class

    在objc/runtime.h中objc_class结构体的定义如下:

struct objc_class {

Class isaOBJC_ISA_AVAILABILITY;//isa指针指向Meta Class,因为objc类本身也是一个object(对象),为了处理这个关系,runtime创造了Meta Class,当一个类发送[NSObject alloc]这样消息时,实际上是把消息发送给Class object类对象

#if !__OBJC2__

Class super_classOBJC2_UNAVAILABLE;//父类

const char *nameOBJC2_UNAVAILABLE;//类名

long versionOBJC2_UNAVAILABLE;//类的版本信息,默认为0

long infoOBJC2_UNAVAILABLE;//类信息,供运行时使用的一些位表示

long instance_sizeOBJC2_UNAVAILABLE;//该类的实例变量大小

struct objc_ivar_list *ivarsOBJC2_UNAVAILABLE;//该类的成员变量的链表

struct objc_method_list **methodListsOBJC2_UNAVAILABLE;//方法定义的链表

struct objc_cache *cacheOBJC2_UNAVAILABLE;//方法缓存,对象接到一个消息会根据isa指针查找消息对象,这时会在methodLists中遍历,如果cache了,常用的方法调用时就能够提高调用的效率。

struct objc_protocol_list *protocolsOBJC2_UNAVAILABLE;//协议链表

#endif

} OBJC2_UNAVAILABLE;

在objc.h中有这样一个定义

/// An opaque type that represents an Objective-C class.

typedef struct objc_class *Class;

即:OC当中任何一个类都是用objc_class这样一个结构体来描述的。

objc_object与id

    objc_object是一个类的实例结构体,objc/objc.h中objc_object是一个类的实例结构体定义如下:

struct objc_object {

Class isa OBJC_ISA_AVAILABILITY;

};

typedef struct objc_object *id;

    与objc_class相同,在OC当中用一个结构体描述一个对象;在向object发送消息的时候,runtime会根据object的isa指针找到这个实例的object所属于的类,然后在类的方法列表以及父类的方法列表中寻找对应的方法运行。

    id是一个objc_object结构类型的指针,这个类型的对象能够转换任何一种对象。

Meta Class

    大家可能注意到,一个对象的isa指针会指向它的类。然而在面向对象的世界里,一切都是对象,即:一个类也是一个对象,那么问题来了,那这个类对象它的类是谁呢(可能有点绕大家稍微理解一下这觉话)?类对象的isa指针又会指向哪里呢?

   为了解决这个问题,runtime创造了元类(Meta Class)。即一个类的是它元类的实例话,一个类的isa指针是指向它的元类。和对象一样,我们向一个类发送消息的时候,isa指针会在元类中以及元类的父类方法列表寻找对应的方法运行。

    既然一切都是对象那么元类也是对象,那么元类的类是谁?元类的isa指针指向哪里呢?下面这张经典的图完美了解释了一些,废话少说上图:


    即任何一个元类都是根元类的对象,任何一个元类的isa指针都指向了根元类;而根元类的isa指针又指向了它自己;形成了一个闭环,这样就完美的诠释了面向对象的世界里万物皆对象的概念。(这张图,大家一定要好好的理解一下,如果今天看不懂,那么我给的建议是明天再看一遍,如果明天还看不懂,那就后天,如果还是不懂,那就过段时间再来看,如此反复,直到成功)

    好吧,到这里大家应该明白了,oc其实就是在用c的结构体来描述类和对象,通过一个isa指针指来指去完成了方法的调用,对于c系的同学来说应该不会有太大的难度。。。

后面会继续写关于runtime的知识。今天就先到这里吧,打卡,下班,回家。。。


顺道拜托,若文中有任何理解不正确的地方欢迎指出

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,678评论 0 9
  • 前言 runtime其实在我们日常开发过程中很少使用到,尤其是像我现在比较初级的程序猿就更用不到了。但是去面试很多...
    WolfTin阅读 608评论 0 2
  • Objective-C语言是一门动态语言,他将很多静态语言在编译和链接时期做的事情放到了运行时来处理。这种动态语言...
    tigger丨阅读 1,378评论 0 8
  • 原文出处:南峰子的技术博客 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了...
    _烩面_阅读 1,214评论 1 5
  • 参考链接: http://www.cnblogs.com/ioshe/p/5489086.html 简介 Runt...
    乐乐的简书阅读 2,128评论 0 9