** __kindof ** 表示当前类或者它的子类
好处: 在调用的时候很清楚的知道 返回类型
** __kindof ** 书写格式:
放在类型的前面:
在说__kindof之前先说说 id 和 instanceType
先创建两个对象类: Person 和 SonPerson继承Person
![](https://img.haomeiwen.com/i1864395/d41da7c460efc7a3.png)
![](https://img.haomeiwen.com/i1864395/9a8711f673c16647.png)
在Person类中实现类方法用于初始化
![](https://img.haomeiwen.com/i1864395/6819fdfc463d7bc8.png)
![](https://img.haomeiwen.com/i1864395/65e8b2a1f17b1fa8.png)
当我们指定返回值类型是id的时候就会出现指向不准确我们可能用了NSString字符串来接收,调用了字符串的length方法,但是person没有这个方法所以就会造成方法找不到错误
![](https://img.haomeiwen.com/i1864395/db418e69bc0e7224.png)
由于对象是id类型所以编译器会提供一些不是person类的方法
![](https://img.haomeiwen.com/i1864395/833c32e6eac568a0.png)
为了解决这个我们可以指定具体的类型,但是指定了具体类型后,用他的子类去接收的时候就会造成不兼容
![]()
![](https://img.haomeiwen.com/i1864395/e1f7ff536572b102.png)
![](https://img.haomeiwen.com/i1864395/7ce23137b8373284.png)
为此Apple公司推出来intancetype类型
![](https://img.haomeiwen.com/i1864395/985a167d3361e2d0.png)
![](https://img.haomeiwen.com/i1864395/b51d41ac596c1aba.png)
虽然不会报警告了但是还是不知道类型是什么依然不能好好使用
![](https://img.haomeiwen.com/i1864395/8c586cc1d3799578.png)
![](https://img.haomeiwen.com/i1864395/22f616e467935d46.png)
因此推出了__kindof
![](https://img.haomeiwen.com/i1864395/3bef11baf2496d50.png)
![](https://img.haomeiwen.com/i1864395/e684af25b3f7c9fa.png)
完美解决问题
![](https://img.haomeiwen.com/i1864395/dad4ce4652e88b6f.png)
// id 坏处 :
1. 不能在编译的时候检测真实的类型
2. 返回值,没有提示
3. id类型的对象调用的方法的时候提示的不准确
// instanceType
会自动识别当前的类型
但是还是无法得知用什么类型去接收
网友评论