Objective-C基础(三)- 韩国绿茶漫画榜漫画

1. objc_class结构体

我们在OC中所写的每一个类,其底层其实都是利用struct结构体来实现的。其中objc_class就是用来保存类和元类对象的结构体。

学习这个结构体对于理解我们上篇文章中提到的OC对象以及之后要讲的Runtime等内容都有很大帮助。

结构体的定义如下(注:为了方便理解和记忆,只保留结构体中重要字段,其余字段省略):

struct objc_class {    Class isa; // isa指针    Class superclass; // superclass指针    cache_t cache; // 方法缓存    class_data_bits_t bits; // 指向具体的类信息的指针}

其中,isa和superclass指针见上篇文章; cache是一个方法缓存,可以理解为一张哈希表,存储着这个类最近被调用的方法; bits是一个指针,指向一个class_rw_t结构体,其中包含具体的类信息。 class_rw_t结构体的定义如下:

struct class_rw_t {    const class_ro_t *ro; // 指向只读信息        struct method_list_t **methods; // 方法列表    struct chained_property_list *properties; // 属性列表    struct protocol_list_t ** protocols; // 协议列表}

首先,class_rw_t中的rw意为readwrite,即这个结构体是可读写的,这也表明类的方法列表,属性列表,协议列表,是可读写的,这在之后的Runtime中会有相应的体现,大家可以先记住。 其次,class_ro_t中的ro意为readonly,即这个结构体指针指向的结构体是只读的(被const修饰),class_ro_t的定义如下:

struct class_ro_t {    uint32_t instanceSize; // instance对象占用的内存    const char * name; // 类名    const ivar_list_t * ivars; // 成员变量列表}

首先,上一篇文章中我们讲到,instance对象中,仅保存成员变量的值,因此,如果成员变量列表ivars是不变的,那么instance对象占用的内存instanceSize自然是不变的,因此他们是只读的。 其次,一个类的类名始终不变。

注意:objc_class用来保存类和元类对象,也就是说class对象和meta-class对象的内存结构是一样的。我们在上篇文章中提到过,class对象存储着属性信息、方法信息、协议信息和成员变量信息;而meta-class对象只存储类方法信息,因此meta-class的属性信息、协议信息、成员变量信息这些字段虽然存在,但是值为空。

关于源代码,请参考Apple官方:https://opensource.apple.com/source/objc4/objc4-437/runtime/objc-runtime-new.h.auto.html

2. getInstanceSize / malloc_size / sizeof

getInstanceSize计算的是一个OC对象 至少需要的内存,存在结构体内存对齐,即结构体大小必须是最大成员大小的倍数。

malloc_size计算的是一个OC对象 实际占用的内存,存在系统内存对齐,即对象占用内存大小必须是系统规定的单位的倍数(栈内存8字节、堆内存16字节)。

举个例子,假设一个类不存在任何成员变量,那么在创建这个类的一个instance对象,instance对象中就只存储着一个指向类对象的isa指针,在64位操作系统下,这个指针占8字节。 那么,如果对这个对象调用getInstanceSize方法,返回的结果就是8字节,即这个对象至少需要的内存。 如果对这个对象调用malloc_size方法,由于对象存储在堆上,因此需要做系统内存对齐(扩展为16的倍数),返回的结果为16字节,即这个对象实际占用的内存。 也就是说,在创建对象的时候,如果对象需要的空间小雨16字节,系统就会硬性分配16字节的空间给对象。

关于结构体内存对齐和系统内存对齐,面试官基本不咋考,感兴趣的同学可以上网搜索资料自行学习。

最后,关于sizeof,它与上面提到的两个函数之间的区别在于:

sizeof是运算符,不是函数

只能计算基本数据类型的占用空间,不能传入一个OC对象

sizeof是运算符,其返回值在编译期就已经决定了,例如如果传入的是一个bool类型的变量,就返回1,int返回4。因此,它的运行效率比上面提到的两个函数要高

好啦,今天就先讲到这里。

我的牛客网账号是917470656,上面有我记录的几篇面经。

个人公众号:iOS开发学习

未经作者允许,禁止转载!

[李贤x允宰x叙厚的激情三角恋!]偶然在gay吧认识的李贤和允宰既是同属一个游泳队的选手,也是伴。从来都不分场地、尽情享受的二人,某一天却碰巧在事中被游泳馆职员叙厚撞见...
2023-05-19
13岁那年成为孤儿的子豪,被爸爸的朋友收养。然而成年后的子豪却对两性关係一无所知,阿姨与姊姊们决定给纯洁的子豪,来场祕密教学…
2020-11-09
经过了一番努力,柯冠文终于被知名企业录取。然而就在他上班的第一天,年轻的美女组长就主动扑向他!!「组长…我们才认识第一天,妳会不会太热情了?」
2021-03-09
兔子兽人孝振将被抛弃的黑豹兽人知河当作自己的亲弟弟一般抚养长大了.茁壮成长的知河一成人就开始向孝振每天告白表达爱意而孝振每天都会拒绝.但是某天孝振却突如其来的进入了fq期,不知所措的孝振接受了知河的帮助…“我现在也成人了.我来帮你.”
2023-05-19
投资有成的志汉买下了三间小套房当上年轻房东,没想到第一天就遇到高中同班的太妹同学,重启被当小弟使唤的生活,另一方面又遇到赖皮房客带着礼物来拜託他宽限房租期限,「房东先生,不然我可以用其他东西抵房租吗?」
2021-06-25
“如果能有人来...摸摸我就好了。”申亦范在为委托人驱除梦魇之时,却反遭‘逆’ 的侵蚀。问题是自己的逆竟然发作成了‘干茶烈火般的x欲’....!“我来帮你吧,亦范先生可以尽情在我身上发泄。”
2023-05-19
大学生美木是一个因为曾经被强行戴上项圈所以非常抗拒Dom的Sub。‘讨厌这种性,也讨厌Dom...’虽然大脑一直在否认,但是本能上又渴望被控制,而这种无法发泄的欲望他就只能靠H小说来纾解。有一天,美木在去做兼职保姆的时候遇到了Dom森谷。虽然在满满的戒备心下完成了工作,但身体却已不受控制。偶然翻到客厅书柜里,他喜欢的小说作家未发表的新作,不知不觉看得入迷,被森谷撞见了他不堪的状态...?!在一个存在[第2性]主仆关系的世界里发芽的充满幸福和爱情的Dom/Sub设定BL。
2023-05-19
“隐藏在爱情后面的是他极致的执着”被怪物追击处于危险之中的浩宇.紧急瞬间,拥有s级超能力的午律救下了他.“没事吧?”S级超能力者午律和普通人浩宇的生活完全不一样本以为两人再也不可能遇见了但是几天之后两人在想不到的地方重逢了.搬到浩宇隔壁的午律已经知道了他的名字在一次次的接触中,产生了不一样的感觉…究竟对普通人A如此热情的原因是什么呢?
2023-05-19
无可奈何的情况下 拜倒于各个石榴裙下的男子 体验偷情的快感
2015-05-01
和15年前同樣下著梅雨的初夏夜晚,全身淋得濕答答的鄰居姐姐再次出現於傢門前,乞求翔平的爸爸收留她們姐妹倆當傢庭幫傭。翔平看著對過往隻字不提的初戀對象-芷榆姐感覺越來越陌生,而和差不多年紀的芷琳,卻在同一個屋簷下愈發親近...「少爺,請問今天想來點什麼♥」
2023-04-12