黑马程序员技术交流社区

标题: id和class有没有什么联系啊? [打印本页]

作者: 小月格子猫    时间: 2014-9-10 13:58
标题: id和class有没有什么联系啊?
id的指针和NSObject指针是一样的吗?
还有就是关于class的对象就是类该怎么理解?
作者: 眼瞳╄渲染繁华    时间: 2014-9-10 14:38
id是一种数据类型,可以定义变量,任何继承与NSObject *的id都可用,就是说id=NSObject *
class的对象就是类?这个是创建对象时需要[类名 new]
作者: 此生逍遥    时间: 2014-9-10 17:49
id指针是万能指针,可以指向任何对象,就相当于(NSObject  *),class是类的总称,所有的类都是它的对象。
作者: 王绍明    时间: 2014-9-10 19:41
id是定义初始化的数据类型 class是OC语言类的统称
不要想太多,仅此而已
作者: xiniuniu    时间: 2014-9-11 12:27
本帖最后由 xiniuniu 于 2014-9-13 15:43 编辑
  1. typedef struct objc_class *Class;

  2. typedef struct objc_object {
  3.     Class isa;
  4. } *id;


  5. @interface NSObject <NSObject> {
  6.     Class        isa;
  7. }

  8. // (runtime.h)
  9. struct objc_class {
  10.     Class isa;
  11. #if !__OBJC2__
  12.     Class super_class                                        OBJC2_UNAVAILABLE;
  13.     const char *name                                         OBJC2_UNAVAILABLE;
  14.     long version                                             OBJC2_UNAVAILABLE;
  15.     long info                                                OBJC2_UNAVAILABLE;
  16.     long instance_size                                       OBJC2_UNAVAILABLE;
  17.     struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
  18.     struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
  19.     struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
  20.     struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
  21. #endif

  22. } OBJC2_UNAVAILABLE;
复制代码


Class是typedef定义的指向 objc_class结构体指针类型的别名, 而id则是typedef定义的指向objc_object 结构体指针类型别名,在这个结构体中只有一个指向objc_class结构体的指针isa;
NSObject类中也只有一个Class类型成员变量isa

可以说他们三个的类型是一样的。作用区别也是不大的

        objc_class结构体存放类的“元数据”(metadata),例如类的实例实现了几个方法,具备多少个实例变量等信息。此结构体的首个变量也是isa指针,这说明Class本身亦为Objectiove-C对象。结构体里还有个变量叫super_class,它定义了本类的超类。类对象所属的类型(也就是isa所指向的类型)是另外一个类,叫做“元类”(metaclass),用来表述类对象本身所具备的元数据。“类方法”就定义于此处,因为这些方法可以理解成类对象的实例方法。第个类仅有一个“类对象”,而每个“类对象”仅有一个与这相关的“元类”。
        所设有个名为SomeClass的子类从NSObject中继承而来,则继承体系如图:


图中也画出了两个对应“元类”之间的继承关系
super_class指针确立了继承关系,而isa指针描述了实例所属的类。通过这张布局关系图即可执行“类型信息查询”。我们可以查出对象是否能响应某个选择子,是否遵从某项协议,并能看到对象位于“类继承体系”的哪一部分。

以上图片和文字摘自《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》

这也说明了id为什么是万能指针。只要给他任何一个对象地址。他就可以通过这个继承关系找到可以调用的方法等信息。





作者: himym2005    时间: 2014-9-12 21:52
xiniuniu 发表于 2014-9-11 12:27
Class是typedef定义的指向 objc_class结构体指针类型的别名而id则是typedef定义的指向[/bac ...

说的明白,厉害




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2