Objective-C 中的id到底是什么-程序员宅基地

技术标签: Objective-C  id  iOS  

学习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的结构可以解释这个。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013230511/article/details/42504583

智能推荐

Vue显示和隐藏如何用动画形式显示_显示隐藏从上向下动画效果css vue-程序员宅基地

文章浏览阅读4.9k次。Vue提供了transition的组件,在正常情况中,可以给任何元素和组件添加”进入”和”离开”过渡动画。在使用v-if或者v-show的时候,想让效果好看一些,毕竟前端吗,要审美哈哈~其实好多种实现方法,这里列出这一两种1.使用transition +css实现<div id="app"> <input type="button" value="按钮" @click="toggle"> <transition name="fade"&_显示隐藏从上向下动画效果css vue

怎么重置imac_[Mac硬件]如何重置 Mac 的 SMC-程序员宅基地

文章浏览阅读2k次。本次教程将告诉大家如何重置 Mac 电脑上的 SMC(系统管理控制器),以下教程均针对使用 X86 架构Intel 处理器的 Mac(2005 年 6 月之后生产),早期使用RISC 架构 PowerPC 处理器的 Mac 不适用本教程。Apple SMC 工作原理图一、什么是 SMCSMC 是 System Management Control的缩写,中文名称为系统管理控制器。它是 Mac 主...

宽带的上行跟下行是什么_adsl上下行对称方式-程序员宅基地

文章浏览阅读1.3k次。运营商所说的几M的宽带和下载速度是2个不同的概念。而运营商的几M的宽带,单位是比特(bit),就是说10M宽带实际上是指10M的bit,也是10*1024K的bit。比如现在一般电信的100M家用光纤,上行速度就是12.5M,当然这个M数不是实际的速度,简单可以除以10,就是实际速度,也就是说100M光纤,理论你下载速度可以达到10M每秒,上传则只有1.25M。1、上行速度是你上传的速度,比如你发邮件,上传照片等,下行速度主要是你下载的速度,比如你看电影,下载东西等,平时我们说的几M,都是指下行的速度。_adsl上下行对称方式

kali-进行抓包以及aircrack-ng跑包和hashcat跑包_kali进行抓包-程序员宅基地

文章浏览阅读3.8k次,点赞39次,收藏37次。使用kali进行抓包以及aircrack-ng跑包和hashcat跑包_kali进行抓包

代码版本管理工具介绍_visual source safe 和 svn-程序员宅基地

文章浏览阅读5.9k次。笔者有幸接触过以下几种常用的配置管理工具:VSS、SVN、Clearcase,在此做一个小小的总结,并Ctrl+C了以前一些网友的对比评论,不一定准确,只是希望通过这些总结对自己和初学者有所帮助。如果想进一步了解这些工具,请baidu和google,如果想深入了解,敬请到图书馆借书并实践。一、 Visual Source Safe( 简称 VSS )VSS是微软的产品,是配置管理的一种很好的入门级..._visual source safe 和 svn

索引+事务_唯一键索引冲突是inster时产生的还是commit的时候-程序员宅基地

文章浏览阅读296次。这里写目录标题事务的ACID特性数据库的事务是什么?隔离性(Isolation)概念说明脏读可重复读不可重复读:一个事务A,不同时刻读同一数据可能不一样幻读:事务A,B同时Insert,B先提交,A没有察觉InnoDB支持的事务隔离级别MySQL 中执行事务1.读未提交:不加锁2.读提交:解决update/inerst引入的脏读,无法做到可重复读3.可重复读:解决update引入的不可重复读,不能解决Insert引入的幻读总结:MySQL 中是如何实现事务隔离的:可重复读可重复读——多版本——针对一条事务可_唯一键索引冲突是inster时产生的还是commit的时候

随便推点

中科网威工业级防火墙通过电力行业测评_电力行业防火墙有哪些-程序员宅基地

文章浏览阅读2k次。【IT168 厂商动态】 近日,北京中科网威(NETPOWER)工业级防火墙通过了中国电力工业电力设备及仪表质量检验测试中心(厂站自动化及远动)测试,并成为中国首家通过电力协议访问控制专业测评的工业级防火墙生产厂商。   北京中科网威(NETPOWER)工业级防火墙专为工业及恶劣环境下的网络安全需求而设计,它采用了非X86的高可靠嵌入式处理器并采用无风扇设计,整机功耗不到22W,具备极_电力行业防火墙有哪些

第十三周 ——项目二 “二叉树排序树中查找的路径”-程序员宅基地

文章浏览阅读206次。/*烟台大学计算机学院 作者:董玉祥 完成日期: 2017 12 3 问题描述:二叉树排序树中查找的路径 */#include #include #define MaxSize 100typedef int KeyType; //定义关键字类型typedef char InfoType;typedef struct node

C语言基础 -- scanf函数的返回值及其应用_c语言ignoring return value-程序员宅基地

文章浏览阅读775次。当时老师一定会告诉你,这个一个"warning"的报警,可以不用管它,也确实如此。不过,这条报警信息我们至少可以知道一点,就是scanf函数调用完之后是有一个返回值的,下面我们就要对scanf返回值进行详细的讨论。并给出在编程时利用scanf的返回值可以实现的一些功能。_c语言ignoring return value

数字医疗时代的数据安全如何保障?_数字医疗服务保障方案-程序员宅基地

文章浏览阅读9.6k次。十四五规划下,数据安全成为国家、社会发展面临的重要议题,《数据安全法》《个人信息保护法》《关键信息基础设施安全保护条例》已陆续施行。如何做好“数据安全建设”是数字时代的必答题。_数字医疗服务保障方案

确定性随机数发生器测试向量——DRBG-HMAC-SHA1_drbg_nopr_hmac_sha1-程序员宅基地

文章浏览阅读3.4w次。结构体定义//DRBG测试中用, 因测试使用数据有很多相同之处typedef struct dat_st{ int len; char * dat;}tvstr;//DRBG的测试向量typedef struct drbg_test_vector_st { char * inf; //测试向量的附加信息说明 int alg..._drbg_nopr_hmac_sha1

Apache Lucene 8.0.0 发布,Java 全文搜索引擎-程序员宅基地

文章浏览阅读239次。开发四年只会写业务代码,分布式高并发都不会还做程序员? >>> Lucene PMC 宣布推出 Ap..._lucene 8.0.0

推荐文章

热门文章

相关标签