黑马程序员技术交流社区

标题: 类的实质真的是对象吗? [打印本页]

作者: 蜡笔3285    时间: 2015-2-12 12:20
标题: 类的实质真的是对象吗?

我最近在学习OC中的类和对象,有点晕,大家看看我的理解对不对:① 类的方法是放在静态代码区的;
② 类alloc出来的对象,在堆区,是一个由属性和isa组成的结构体,isa指向静态代码区的对应方法;
那么问题来了:
① 类到底有没有开辟新的空间?如果开辟了空间的话,里面放的是什么?
② alloc方法在对象属性还没有创建的时候,是怎么知道属性的细节的?在类开辟的空间里有这样一个属性?还是alloc直接从静态代码区(我假设静态代码区里有类似int a;这样的代码,或者说汇编之后优化的代码)分析出了各属性的尺寸?


我在积累技术分,悬赏有点少,各位大大请见谅~







作者: itheima2xy    时间: 2015-2-12 12:20
类对象分配了存储空间,也在堆区,里面存储的是方法名,方法就是一个函数指针,函数代码是存在静态代码区的,掉用对象方法时,isa指针指向了类对象,根据方法名再找到方法体执行,是这样吗?
作者: 蜡笔3285    时间: 2015-2-15 19:57
本帖最后由 蜡笔3285 于 2015-2-15 19:58 编辑

好几天没人回答呀,纠结,我自己找到了一些答案,写在下边吧,大大们看看对不对:
从库里找到 :
typedef struct objc_class *Class;
可以知道Class是一个 objc_class,也就是说他是一个对象。
  1. struct objc_class {
  2.     Class isa  OBJC_ISA_AVAILABILITY;

  3. #if !__OBJC2__
  4.     Class super_class                                        OBJC2_UNAVAILABLE;
  5.     const char *name                                         OBJC2_UNAVAILABLE;
  6.     long version                                             OBJC2_UNAVAILABLE;
  7.     long info                                                OBJC2_UNAVAILABLE;
  8.     long instance_size                                       OBJC2_UNAVAILABLE;
  9.     struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
  10.     struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
  11.     struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
  12.     struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
  13. #endif

  14. } OBJC2_UNAVAILABLE;
复制代码

可以看出,这是一个特殊的对象,他的里面包含了这个类的一些相关信息,以及用于alloc实例的参数列表信息,这些信息应该是在编译的时候确定的,也就是说,alloc方法是通过类对象来找到分配空间的信息的。
以上。

作者: keven1119    时间: 2015-3-12 20:37
来顶一下




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