id和instancetype和NSObject

本文深入探讨了Objective-C中的id与NSObject的区别与联系,包括它们的相似点与不同点,以及如何在代码中使用它们。重点阐述了id的灵活性与NSObject的强类型检查,帮助开发者更好地理解和运用Objective-C的基础类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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*来表示。 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值