A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小月格子猫 中级黑马   /  2014-9-10 13:58  /  2249 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

id的指针和NSObject指针是一样的吗?
还有就是关于class的对象就是类该怎么理解?

5 个回复

倒序浏览
id是一种数据类型,可以定义变量,任何继承与NSObject *的id都可用,就是说id=NSObject *
class的对象就是类?这个是创建对象时需要[类名 new]
回复 使用道具 举报
id指针是万能指针,可以指向任何对象,就相当于(NSObject  *),class是类的总称,所有的类都是它的对象。
回复 使用道具 举报
id是定义初始化的数据类型 class是OC语言类的统称
不要想太多,仅此而已
回复 使用道具 举报
本帖最后由 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为什么是万能指针。只要给他任何一个对象地址。他就可以通过这个继承关系找到可以调用的方法等信息。




评分

参与人数 1技术分 +1 收起 理由
★彬★卍囧神 + 1 找的资料?

查看全部评分

回复 使用道具 举报
xiniuniu 发表于 2014-9-11 12:27
Class是typedef定义的指向 objc_class结构体指针类型的别名而id则是typedef定义的指向[/bac ...

说的明白,厉害
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马