天天看点

Objective-C 2.0 with Cocoa Foundation---NSObject的奥秘(1)

 objecsive-C从本质上来说,还是C语言的。那么内部究竟是怎样实现SEL,Class和IMP,还有封装和继承的?为了解答这个问题,笔者决定在本章向大家概要的介绍一下objecsive-C的最主要的一个类,NSobjecs。   不过说实在话,如果同学们觉得本章的内容比较晦涩难懂的话,不阅读本章的内容丝毫不会对写程序产生任何不良的影响,但是如果掌握了本章的内容的话,对加深对objecsive-C的理解,对于今后笔者将要讲述的内容而言,将会是一个极大的促进。   6.1,本章程序的执行结果   在本章里面,我们将要继续使用我们在前面几章已经构筑好的类Cattle和Bull。由于在现在的Xcode版本里面,把一些重要的东西比如说Class的原型定义都放到了LIB文件里面,所以这些东西的具体的定义,对于我们来说是不可见的。   我们首先把第4章的代码打开,然后打开“Cattle.h” 文件,把 鼠标移动到“NSobjecs”上面,单击鼠标右键,在弹出菜单里面选择“Jump to Definition”。然后会弹出一个小菜单,我们选择“interface NSobjecs” 。我们可以看到如下代码 @interface NSobjecs  {

    Class       isa;

Objective-C 2.0 with Cocoa Foundation---NSObject的奥秘(1)

 我们知道了,所谓的NSobjecs里面只有一个变量,就是Class类型的isa。isa的英文的意思就是is a pointer的意思。也就是说NSobjecs里面只有一个实例变量isa。好的,我们需要知道Class是一个什么东西,我们把鼠标移动到 “Class”上面,单击鼠标右键,在弹出菜单里面选择“Jump to Definition”,我们看到了如下的代码: typedef struct objc_class *Class;

typedef struct objc_objecs {

    Class isa;

} *id;

...    我们在这里知道了,Class实际上是一个objc_class的指针类型,我们把鼠标移动到“objc_class”上面,单击鼠标右键,在 弹出菜单里面选择“Jump to Definition”,发现我们还是在这个窗口里面,Xcode并没有把我们带到objc_class的定义去,所以我们无从知道objc_class 内部究竟是一个什么样的东西。   笔者顺便提一下,大家也许注意到了id的定义,id实际上是objc_objecs结构的一个指针,里面只有一个元素那就是Class。那么根据上面我们看到的,所谓的id就是objc_class的指针的指针。让我们回忆一下下面的代码: id cattle = [Cattle new];   这句话是在初始化和实例话cattle对象,这个过程,实际上可以理解为,runtime为我们初始化好了Class的指针,并且把这个指针返回给我们。我们初始化对象完成了之后,实际上我们得到的对象就是一个指向这个对象的Class指针。   让我们在回过头来说说这个神秘的Class,我们无法在Xcode里面看到Class也就是objc_class的定义。庆幸的是这部分的定义 是GCC代码,是开源的。笔者下载了开源的代码之后,把开源的代码作了一些小小的调整,然后把Class的定义等等放到了我们的工程文件里面去,通过类型 转化之后,我们终于可以看到Class,SEL,还有isa等等过去对我们来说比较“神秘”的东西的真正面目。  我们在前面几章里面在每一个章的第一节里面都要介绍一下本章程序执行结果的屏幕拷贝,本章也是一样,但是本章的执行结果非常简单。因为对于本章而言重点应该是放在对NSobjecs机制的理解上。

Objective-C 2.0 with Cocoa Foundation---NSObject的奥秘(1)

转载于:https://blog.51cto.com/mkhgg/654759