Objective-C 中的id到底是什么

学习iOS时,会说到使用id可以指向任意类类型的变量(除开基本数据类型)

那么到底为什么id可以指向,任意的类类型的变量?到底id是什么?

很多教程书都只是浅显的说到,因为objc中所有的类类型都继承自NSObject

id相当指向NSObject的指针,因而id能用于指向所有的类类型的变量


今天我就要来看清楚,id,你到底是个什么东西?


关于id的声明,最开始是在objc/objc.h有提及

<img src="https://img-blog.csdn.net/20150126213246873" alt="" />


可以看到,其实id真的是一个指针,注释也说了:指向一个类实例的指针,但是具体跟NSObject有什么关系?


接下来我们看看objc_object又是啥?还是在上图,有objc_object的定义



objc_object其实是一个结构体,结构体内有一个变量类型为Class的isa指针


也就是说,id指针是一个objc_object结构体的指针


等等,不是说id是类类型的指针吗?怎么变成结构体指针了?


看看NSObject的类长啥样,去到NSObject.h头文件看看,NSObject的定义



只有一个变量!


对于结构体而言,只有一个元素,对于类而言,只有一个变量。

其实,在内存中的结构而言,都是一样的。


正如同不同的基本类型的指针不能互相转换,这是因为不同类型在内存开辟空间不同,不能随意用指针指向,这里的objc_object结构体和NSObject有着一样的内存大小,指针可以转换,也就能说得通了!


口说无凭,实验一下




可以看到objc_object,NSObject有同样得结构,只是objc_object没有给isa赋值,所以没有值。

但是他们两者拥有一样的内存空间,那么其实

id指针是一个objc_object结构体的指针



有人会疑问,为什么一个结构体可以代表一个类的实例?而且这个结构体只有一个Class isa,一个类不是应该有变量,应该有方法吗?仅仅一个Class isa那便可以?当一个实例变量想调用方法时,方法如何的实现?当一个实例变量想获取变量,怎么办?


如果看过runtime的,结合NSObject的结构可以解释这个。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值