//======= id
和instancetype ================================
-
id
和instancetype
都可以做方法的返回值。 -
id
类型的返回值在编译期不能判断对象的真实类型,即非关联返回类型,instancetype
类型的返回值在编译期可以判断对象的真实类型,即关联返回类型。 -
id
可以用来定义变量, 可以作为返回值, 可以作为形参,instancetype
只能用于作为返回值。
//======= id
和 NSObject * ================================
- id 并不一定是NSObject对象,并非所有对象都是继承于NSObject,比如NSProxy。同时,id与NSObject对象之间有很多的共同方法,比如retain/release等方法。说到底,任何对象的本质都是id类型。
- 对于id类型,可以调用任意可见的selector,编译器不会进行检查。而对于NSObject *的对象来说,只能调用NSObject *对象所包含的selector。
- 对于一些不想或不能进行类型检查的地方,可以使用id。在运行的时候通过respondToSelector:来进行检查。
- 使用id来声明一个对象,相当于告诉编译器我们并不知道这个对象的类型,但是它实现了协议。
- 使用
id
修饰的对象是动态类型,编译器在编译期不会去判断其真实类型,因此id
指向的对象不管向其发送任何消息,编译器在编译期都不会有任何报错
- 使用
NSObject *
修饰的对象是静态类型,在编译期就已经明确该对象是NSObject
对象,因此当我们对该对象发送NSObject
没有声明的方法时,编译器就会果断报错
https://www.jianshu.com/p/17c0cdde627c
https://www.cnblogs.com/CoderCLsun/p/5838223.html