1.id是通用类型的指针,编译时不进行类型检查
2.id和instancetype的相同点、不同点
1)相同点
都可以作为方法的返回类型
2)不同点
instancetype只能作为返回值;id可以做为返回值,也可以作为参数的类型
instancetype可以返回和方法所在类相同类型的对象;id只能返回未知类型的对象
3.NSObject和id
NSObject对象会进行编译时检查(需要强制类型转换)
id可以直接用,不需要强制类型转换
id是动态类型,编译器不再检查类型
id在objc.h中的定义:
/// Represents an instance of a class.
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
NSObject.h中,NSObject类的定义如下
@interface NSObject <NSObject> {
Class isa OBJC_ISA_AVAILABILITY;
}
+ (void)load;
+ (void)initialize;
- (instancetype)init;
+ (instancetype)new;
+ (instancetype)allocWithZone:(struct _NSZone *)zone;
...
参考
两个类型都含有Class isa,但NSObject同时包含了一些其它的方法,并需要实现NSObject协议。
所以NSObject*可以用id来表示。但id不能用NSObject*来表示。