id instancetype NSObject *的区别
1、instancetype只能用于方法的返回类型,而id用处和NSObject *类似。
2、instancetype会告诉编译器当前的类型,这点和NSObject *类似,但id对于编译器却是无类型的,调用任何方法不会给出错误提示。
3、对于init方法,id和instancetype是没有区别的。因为编译器会把id优化成instancetype。当明确返回的类型就是当前Class时,使用instancetype能避免id带来的编译不出的错误情况。
4、NSObject Class和id都是仅包含了一个Class isa。但NSObject 包含了更多方法的定义。
5、id和instancetype都能省去具体类型,提高代码的通用性。而这是NSObject *不及的。
6、id 是 Objective-C 对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的,比如NSProxy。同时,id与NSObject对象之间有很多的共同方法,比如retain与release等方法。更一步来说:所有的对象本质来说都是 id 类型的。
从iOS的SDK头文件中,我们能看到一些定义
在objc.h中,可以看到id的定义如下
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
在NSObject.h中,可以看到NSObject类的定义如下
@interface NSObject <NSObject> {
Class isa;
}
+ (void)load;
+ (void)initialize;
- (id)init;
+ (id)new;
+ (id)allocWithZone:(NSZone *)zone;
+ (id)alloc;
- (void)dealloc;
// 很多其它方法
@end
两个类型都含有Class isa,但NSObject同时包含了一些其它的方法,并需要实现NSObject协议。
所以NSObject*可以用id来表示。但id不能用NSObject*来表示。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步