协议&泛型

236 阅读2分钟

协议

协议中可以定义初始化方法,当实现初始化器的时候必须使用required关键字 上面打印0.0是因为在extension中声明的函数的调度方式是静态调用的,在编译过程中,当前函数的地址已经确定,在调用过程中直接拿到函数地址来做跳转并进行调用,在静态调用的过程当中,对于子类来说重写area是没有意义的。 当改成类型为Circle时调度的方式是不一样的 查看上图的sil文件当把协议里的函数注释掉!查看sil文件

总结:
    协议里的函数会在遵守这个协议的类中生成一个pwt,pwt中包含了类对这个协议中函数的实现;
    这个协议的实现本质上也是通过class_method找到类当中的方法并调度;
    没有生命在协议里的函数,只是又一个默认的实现,并且这个地址在编译的过程当中已经确定;
    而对于这个遵守协议的类来说是没办法重写的

查看上图的打印出的大小,查看ir文件

截屏2021-03-11 下午2.42.02.png仿写

截屏2021-03-11 下午3.18.19.png分析下上图中的24*i8这个数组,修改下代码

截屏2021-03-11 下午3.43.09.png查看ir文件

截屏2021-03-11 下午4.32.09.png,在xcode查看

截屏2021-03-11 下午4.42.50.png如果有3个指就存到第三位,但如果超过3个值的话就会不同

截屏2021-03-11 下午4.53.32.png当存入的值超过3个数组里除了首位不会再存值,而是在堆区分配了一块内存空间,把这块空间的指针存到首位

截屏2021-03-11 下午5.10.39.png查看上图代码这个也和协议类似,虽然在创建实例变量的时候是Shape类型,但是他会去pwt中调用原类型的vtable,再通过vtable来调用原类对应的方法

泛型

泛型就是来提高代码的复用性

截屏2021-03-15 上午11.04.05.png查看上图代码的ir文件

截屏2021-03-15 上午11.03.41.png仿写

截屏2021-03-15 上午11.41.12.png

查看下列代码 截屏2021-03-15 下午3.40.57.png泛型是如何区分传入不同的参数来管理内存的

范德萨范德萨范德萨范德萨.jpg