Object-C|对象原理(下)

Object-C|对象原理(中)

{\huge\pmb{Object-C|对象原理(下)}}

我们继续探索alloc开辟内存空间绑定对象与isa
在计算出内存大小后,我们可以看到代码会继续往下走到maclloc_zone_calloc \ calloc中的其中一个,根据之前的方法可以找到,calloc 并不是objc开源库中的,而是malloc中的方法,那么我们就跟着方法继续探索malloc开源库

开辟内存空间

malloc源码分析

我们编译好malloc开源库后,就可以看到calloc的内部实现是这个样子的

calloc

跟着方法中主要的流程继续跟下去,发现在maccoc_zone_calloc方法中我们主要的ptr对象已经跟不下去了,在这个时候我们可以使用另外的方法

malloc_zone_calloc

通过LLDB打印得出ptr = zone->calloc的方法其实是执行default_zone_calloc方法

default_zone_calloc

再继续跟住


runtime_default_zone

按照流程会来到这里,发现又断开了


inline_malloc_default_zone

根据之前的经验,运用技巧发现它其实会走到nano_malloc方法

nano_malloc

最终走到了这个方法里面进行对象的内存开辟

_nano_malloc_check_clear

总结:其实我们做了很多没有什么新的实质内容的事情,一直在跟方法流程,但是从中我们学会了解决就算我们拿到了开源库有时候也会因为被代码逻辑纠缠住找不到重点,从而跟不下去的问题。跟代码其实不重要 ,掌握学习的方法很重要

Isa关联

开辟空间后 我们得到了内存地址指针isa但是这个时候打印输出我们的对象发现还会是null其原因就是并没有将isa对象进行关联

initInstanceIsa

其内部实现方法


再继续跟到initIsa,发现isa其实就是isa_t的返回,也就是结构体

initIsa

isa_t使用了联合体位域来优化内存空间

isa_t

在判断是否nonpointerIsa后进入到else来进行对象isa绑定类信息填充

tips

对象的本质就是结构体

isa结构信息

Isa 8字节 64位

64位中包含了很多的内容
nonpointer表示是否对isa开启指针优化,0 纯isa指针、1 不止是类对象地址,isa包含了类信息、对象的引用计数
has_assoc关联对象标识为,0 没有、1存在
has_cxx_dtor该对象是否有c++或者Objc的析构器,如果有析构函数则需要做析构逻辑,如果没有则更快的释放对象
shiftcls存储类指针的值。开启指针优化的情况下,在arm64架构中有33位用来存储类指针
Magic用于调试器判断当前对象是真的对象还是没有初始化的空间
weakly_referenced指对象是否被只想或曾经只想一个ARC的弱变量,没有若引用的对象可以更快释放
deallocating标志对象是否正在释放内存
has_sidetable_rc当对象引用计数大与10时,则需要借用该变量存储进位
extra_rc当表示该对象的引用计数值,实际上引用计数值减1,例如:如果对象的引用计数为10,那么extra_rc为9,如果引用计数大于10,则需要使用到has_sidetable_rc

tips:

1、通过对象的指针地址与isa_tmask&出该指针地址绑定的类信息
2、通过指针地址所代表的机器码>>3 <<20 >>17来反算(arm64的情况下)
3、直接用runtime下的object_getClass方法

结构体与联合体位域

(1)结构体struct
结构体是指把不同的数据合成一个整体,其变量是共存关系,变量不管是否使用都会分配内存。缺点:所有属性都分类内存,比较浪费。优点:存储容量大包容性强成员之间不会相互影响
(2)联合体位域union
联合体也是由不同的数据类型组成,但其变量是互斥关系 ,所有的成员占用一段内存。而且共用体采用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会将原来的成员的值覆盖掉。缺点:包容性差优点:所有成员共用一段内存 ,使内存的使用更加精细灵活,同时也节省了内存空间

以上


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

推荐阅读更多精彩内容