NSObject没有父类,他是怎么来的呢(一)
来源:互联网 发布:淘宝美工临摹 编辑:程序博客网 时间:2024/04/28 10:04
在我们创建类的时候,都是继承与某一个类创建的,可是NSObject是没有父类,而NSObject是怎么来的呢?首先先让我们看看这个NSObject类中有哪些东西。很明显又一个Class结构体的指针 isa,Class是什么呢?我们点击进去看。他是一个objc_class的结构体的指针,可是objc_class中也是有一个Class的isa,结论,在objc的runtime中,类是用objc_class结构体表示的,对象是用objc_object结构体表示的。每一个对象都有一个名为 isa 的指针(也就是指向这个对象在runtime中的结构体的内存地址),指向该对象的类。 对象的isa用来标示这个对象是哪个类的实例。那么元类的 isa 指针又指向哪里呢?苹果为了设计上的完整,isa 指针指向自己,这样就行成了一个闭环。即所有事物都是对象,都有 isa 指针。首先,这些源码是属于objc runtime的,庆幸的是objc runtime的源代码苹果已经开源了,点击打开链接。打开objc/Source/NSObject.mm这个文件,这就是NSObject的实现代码。大概浏览一遍,函数是不是有很多都非常熟悉呢?可以说这些函数接口我们每天都在用,这次终于该好好看看它们是怎么实现的了。 为了方便,我把其中一部分代码摘录出来
- - (Class)class {
- return object_getClass(self);
- }
- Class object_getClass(id obj)
- {
- return _object_getClass(obj);
- }
- static inline Class _object_getClass(id obj)
- {
- if (obj) return obj->isa;
- else return Nil;
代码非常直白,注意下最后这个函数:
- }
- static inline Class _object_getClass(id obj)
- {
- if (obj) return obj->isa;
- else return Nil;
如果obj不空,返回的Class类型就是obj->isa,否则,返回的是Nil。这就从源码上证实了isa就是代表一个对象的类型。 通过上面的源码分析,我们搞明白了对于普通的对象实例,isa就是表明它所属的类型。通过调用 class等方法返回的其实就是这个isa变量。 下面我们再来分析一下类objc_class,为什么它也有一个isa变量呢?
- }
- struct objc_class {
- Class isa;
在面向对象的设计中,万物皆对象,所以类(Class)也是一个对象,它也有一个isa,那么类的isa指向谁呢? 我们看这句代码[NSObject class],这里我们调用了+ (Class)class这个类方法,我们再开发中经常用到这个方法,它返回的是这个类所属的Class类型。这是不是就可以作为一个类也是一个对象的佐证呢? 我们继续看看objc runtime的源码,你可以在objc/Source/NSObject.mm这个文件中找到下面的代码:
- };
- + (Class)class {
- return self;
[NSObject class]这句代码返回的竟然是self,我们都知道对于一个类的实例来说,self总是指向其自身的,但是这里并没有实例啊,我们是直接调用了NSObject这个类的一个类方法+(Class)class啊。返回的是Class结构体,也就是self。 这个函数的返回值是一个类对象class object(也是结构体——objc_object),所以其本质上还是一个对象而已。既然是一个对象,它拥有一个self指针是不是就不奇怪了呢?现在我们就明白了,对于像NSObject这样的类来说,它其实代表的是一个类对象,本质上还是一个普通的实例对象,类对象的self指针应该指向的是这个类对象自身。明白了吧?但是关于self的详细介绍,很遗憾,需要到更低层,也就是 objc 语言层去寻找答案了。因为self是 objc 的保留关键字,所以,objc 需要为这个关键字提供语言层面上的支持,我们要找到答案,可以从self这条线索入手,看看 objc 到底是怎样实现的。
- }
以上是我自己的研究,有什么问题请列举出来,大家共同学习。
1 0
- NSObject没有父类,他是怎么来的呢(一)
- 看看这个页面,水能告诉我他是怎么做出来的??
- 积分怎么来的呢?
- BCG、MFC如何支持《支持应用程序设置的回复、保存等》的?他是怎么实现的呢?
- 他面对的压力与烦恼要比她多百倍千倍吧,他是怎么做到的呢?
- 分怎么来呢?
- 积分怎么来呢
- UIAlertView 写在NSObject的类中没有回调
- 怎么没有Verilog专区呢?
- 额,我的博客怎么什么东西都没有呢
- IronRuby - 怎么就没有好用的IDE呢
- 自己写的控件怎么用ItemRender来渲染呢?
- 回收站删除的文件丨怎么才能找回来呢
- 怎么把数组转化成字符串呢?有没有现成的函数呢?
- NSObject.h解(一)
- 一、Objective-c-NSObject类的load和initialize方法
- 深入学习Objective-C(一):揭开NSObject的面纱
- 找钢网王东:3年赚900亿他是怎么做到的?
- AJAX初探
- SP324099: 无法完成操作的错误
- LinearLayout的diver属性的一些解释
- 原始ajax post表单
- Windows 平台搭建Redis数据库
- NSObject没有父类,他是怎么来的呢(一)
- 知乎android客户端drawer布局探究
- 最全Pycharm教程(8)——Django工程的创建和管理
- 基于逻辑回归模型 下的简单用户违约预测分析
- USB存储设备(如:U盘,移动硬盘)
- js对象的3个属性
- Core Data
- 回调和监听
- Ajax及其工作原理