关于静态类型、动态类型、id、instancetype
![关于静态类型、动态类型、id、instancetype](https://static001.geekbang.org/infoq/84/84e0beb58bf96ae46ec3189fd75d3e1d.png)
静态类型
一个指针变量定义为特定的对象时,使用的是静态类型,在编译的时候就知道这个指针变量所属的类,这个变量总是存储特定类的对象,默认情况下所有的数据类型都是静态数据类型
静态数据类型的特点:
在编译的时候就知道变量的类型
知道变量中有哪些属性和方法
在编译的时候就可以访问这些属性和方法
并且如果是通过静态数据类型定义变量,如果访问了不属于静态数据类型的属性和方法,那么编译器就会报错
![](https://static001.geekbang.org/infoq/21/2129942d5b3721f58d5e55ebf5f790e2.png)
动态类型
指程序直到执行时才确定对象所属的类
动态数据类型的特点:
在编译的时候编译器并不知道变量的真实类型,只有在运行的时候才知道它的真实类型
id
类型与instancetype
id
类型id
是一种通用的对象类型,它可以指向属于任何类的对象,可理解为万用指针,相当于 C 语言的void*
数据类型,id
也是一个动态数据类型,可以用来定义变量,作为函数参数,作为函数返回值等等id == NSObject*
(万能指针)NSObject*
是一个静态类型由于动态数据类型可以调用任意方法,所以有可能调用到不属于自己的方法,而编译时又不报错,所以导致运行时错误
使用场景:多态,可以减少代码量,避免调用子类特有的方法需要强制类型转化
id 类型不能使用点语法,因为点语法是编译器的特性,而 id 类型是运行时的特性
尽量使用静态类型,静态类型可以更早的发现错误,提高可读性
instancetype
instancetype
在编译时就可以判断对象的真实类型instancetype
只能用于返回值自定义的构造方法,返回值尽量使用
instancetype
,不要用id
版权声明: 本文为 InfoQ 作者【NewBoy】的原创文章。
原文链接:【http://xie.infoq.cn/article/e227673585442f5a16bbec960】。文章转载请联系作者。
评论