scalable_zone是zone其中一种类型, 分配堆内存管理者,malloc,free等函数真正的入口
iOS内存-堆(libmalloc)-简介
发表于
|
分类于
内存
coswift原理分析
发表于
|
分类于
线程
最近看同事朋友圈说阿里开源了一个协程框架,没听过协程的我一脸懵逼,但对于demo中的await实现的效果非常好奇。我就看了下协程的源码(主要是协程的await实现原理)。
Swift方法调用
发表于
|
分类于
Swift
阅读本文前,可以先参考Swift内存布局
本文基于Swift4.2, Xcode10.0
必看:本例的函数指针的替换千万别用在正式项目中,只是用来验证方法的调用方式,具体函数指针在数据结构内存(Vtable和witness_table)的偏移值会在不同的编译器或者语言版本而有不同
编译型程序的方法调用有三种方式,第一种是直接派发(静态调度),运行时寄存器通过call指令直接跳转至代码的具体实现地址。第二种通过虚函数表的方式,通过计算出函数指针在虚函数表中偏移量,得到函数指针,在通过call指令跳转到函数指针指向的内存地址,执行函数。第三种是动态调度,在Objective-C或者Swift(部分方法调用)中通过call objc_msgSend实现消息机制,在执行objc _ msgSend方法时,找到参数类对象(objc_ class)中method__list真正函数实现的指针(IMP),在跳转至函数指针指向的内存执行具体的函数,当然没找到函数指针,会去父类中找,最后在NSObject类对象中没有找到函数指针,还会进行消息转发。(其实第二种和第三种可以合并为动态派发)