协议
协议中可以定义初始化方法,当实现初始化器的时候必须使用required关键字
上面打印0.0是因为在extension中声明的函数的调度方式是静态调用的,在编译过程中,当前函数的地址已经确定,在调用过程中直接拿到函数地址来做跳转并进行调用,在静态调用的过程当中,对于子类来说重写area是没有意义的。
当改成类型为Circle时调度的方式是不一样的
查看上图的sil文件
当把协议里的函数注释掉!
查看sil文件
总结:
协议里的函数会在遵守这个协议的类中生成一个pwt,pwt中包含了类对这个协议中函数的实现;
这个协议的实现本质上也是通过class_method找到类当中的方法并调度;
没有生命在协议里的函数,只是又一个默认的实现,并且这个地址在编译的过程当中已经确定;
而对于这个遵守协议的类来说是没办法重写的
查看上图的打印出的大小,查看ir文件
仿写
分析下上图中的24*i8这个数组,修改下代码
查看ir文件
,在xcode查看
如果有3个指就存到第三位,但如果超过3个值的话就会不同
当存入的值超过3个数组里除了首位不会再存值,而是在堆区分配了一块内存空间,把这块空间的指针存到首位
查看上图代码这个也和协议类似,虽然在创建实例变量的时候是Shape类型,但是他会去pwt中调用原类型的vtable,再通过vtable来调用原类对应的方法
泛型
泛型就是来提高代码的复用性
查看上图代码的ir文件
仿写
查看下列代码
泛型是如何区分传入不同的参数来管理内存的