Objective-C葵花宝典第一重(内功篇)--类与对象

转自:http://husbandman.diandian.com/post/2012-08-17/40036035008

Objective-C葵花宝典第一重(内功篇)–类与对象

切记:欲练神功,挥刀自宫;炼丹服药,内外齐通。

今练气之道,不外存想导引,渺渺太虚,天地分清浊而生人,人之练气,不外练虚灵而涤荡昏浊,气者命之主,形者体之用。天地可逆转,人亦有男女互化之道,此中之道,切切不可轻传。修炼此功,当先养心,令心不起杂念,超然于物外方可,若心存杂念,不但无功,反而有性命之忧。

概述

对象

Objective-C中,类和对象的底层数据结构,可以参考Objective-C底层数据结构.

其中对象是通过struct objc_object结构实现

typedef struct objc_object *id;

对象在运行时候,会产生如下图的结构形式

我们把这个转换成种更容易理解的数据组织形式

真正的内存形式是这样的

从对象内存形式上来看.对象内的变量成员,是从祖类继承而来(子成父业啊),在对象内部生成副本.从对象的内存组织来看,对象本身并不关心行为(对象的方法或实例方法),重点都在数据的组织上.

(_)  _____  ____ _

/ /  / ___/  / __ `/

/ /  (__  )  / /_/ /

/_/  /____/  \__,_/

对象的都有一个isa实例变量,它是从继承层次最高的NSObject继承而来.isa是表示对象的关键.在Objective-C中,是不是第一等对象,isa就是其标志,就好像<变形金刚>中的汽车人都有一个

如果你发现的铁家伙是这个标志

那你就赶紧逃命去吧~

isa是一个指针,指向了该对象的类.实质上,同一个类的实例,都指向同一个类对象(类也是一种特殊对象).类中包含了实例方法,也就是说,同一个类的所有实例共用了这些实例方法.消息就是发送给对象,对象转交给其isa指向类去处理.这种现象类似于当下火热的云计算.

云鸡一算,要风得风,要雨得雨

Objective-C的这种设计,既可以友好地实现面向对象,又可以有效地节约内存.降低冗余数据.对象对方法的调用是通过isa间接去调用,这样就造成了方法调用的动态性,主要原因是:

一个对象并不晓得它能否应答一个方法,它本身既不包含方法的实现,也不包含有方法的指针,而是间接通过isa转到自己的类才能知道

类中的实例方法是以链表形式存在,运行时候,可以修改链表中的实例方法,即可以增删改查,这与C中的函数默认都是extern的不同

从上面的分析,isa的意义就更加重大,倘若没有isa,一个对象就跟char,int类型等没啥区别了,不具备回应消息的本领.所以说,isa是什么,就好比是古时候官员的乌纱帽,有乌纱帽,就有权力,乌纱帽没了,就是凡夫俗子

类是通过struct objc_class结构实现的,

typedef struct objc_class *Class;

在运行时,将会产生如下图这样的结构

在Objective-C的世界里,一看到isa的第一个反应就是,咦,对象.是的,Objective-C中的类其实也是一种对象.

天地不仁,以万物为刍狗<道德经>

既然天地生的万物,那么天地又是何物?

如果人类是上古神仙女娲所造,那女娲又因何而生呢?

一般程序语言,对象的尽头都是自己生了自己.自己下个蛋,爬出来了自己.似乎是悖逆的,但确实如此.作为根类的NSObject就是这样一个家伙!

这看起来确实很困惑,但是譬如生物学中的造血干细胞可谓细胞的制造厂,但是造血干细胞又是谁制造的呢,咦,也是造血干细胞

首先,类对象也是一种对象,那么它也会有自己的行为,这种行为称作类方法.与一般的类实例一样,类对象也不具备处理类方法的能力,也是要借助isa找到它所属的类,既元类,去调用类方法,类对象本身也是专注于数据的存储和布局形式.可参考类和元类

但与常规的类实例不同,一般而言类对象的字段是固定的.即它默认情况下总是包含isa,super_class,name,version,info,instance_size,ivars,methodLists,cache,protocols.

一个类的数据形式会是如下

而它的数据在内存中的组织形式也是线性的

我们知道,在Objective-C中,我们一般的定义形式是声明一个类的实例变量,属性,实例方法和类方法.并不能声明类变量.所以一般而言类对象的数据形式就是如上图的那些固定的字段.

除了我们介绍的isa,剩余的字段的含义如下:

super_class 指向父类的指针.因为Objective-C借鉴了SimTALK,在类的继承实现上,是通过一条继承链实现的.super_class就是整个继承链的核心字段.

name 类的名字

version 版本

info 信息

instance_size 实例的内存大小

ivars 是一个指向实例变量列表的指针

methodLists 是一个指向实例方法列表的指针

cache 缓存了常用的实例方法

protocols 是一个指向协议列表的指针

我们可以这样简单地去解释运行时的Objective-C的数据结构的含义

对象与实例变量有关,对象自身存储着实例变量

类对象与实例方法有关,实例方法必须通过类对象才能知晓

元类与类方法有关, 类方法必须通过元类才能知晓

对象,类与元类可谓与道教里的三清一般哦~~

运行时的类和对象

运行时的类和对象如下图

一般而言

isa关于对象是什么类

super_class关于继承链

所有元类都有同样的元类,因为他们的isa都指向同一个根元类

参考

Objective-C底层数据结构

类和元类

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

推荐阅读更多精彩内容