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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蜡笔3285 中级黑马   /  2015-2-12 12:20  /  3047 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1黑马币

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


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






最佳答案

查看完整内容

类对象分配了存储空间,也在堆区,里面存储的是方法名,方法就是一个函数指针,函数代码是存在静态代码区的,掉用对象方法时,isa指针指向了类对象,根据方法名再找到方法体执行,是这样吗?

4 个回复

倒序浏览
类对象分配了存储空间,也在堆区,里面存储的是方法名,方法就是一个函数指针,函数代码是存在静态代码区的,掉用对象方法时,isa指针指向了类对象,根据方法名再找到方法体执行,是这样吗?

点评

恩,类对象里面包含了方法列表,协议方法列表、super指针等数据,方法列表指向了具体的函数,你是正确的。  发表于 2015-3-1 10:38
回复 使用道具 举报
本帖最后由 蜡笔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方法是通过类对象来找到分配空间的信息的。
以上。
回复 使用道具 举报
来顶一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马