//======= 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
本文深入解析了Objective-C中id与instancetype的区别与应用,包括它们作为返回值的特性,以及与NSObject*的对比。阐述了id类型的动态性和instancetype类型的编译期类型检查优势。
626

被折叠的 条评论
为什么被折叠?



