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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张海龙重新起航 中级黑马   /  2014-5-8 14:17  /  1757 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

OC中所有的类都继承自NSObject,NSObject实现了alloc函数,而NSObject的子类调用NSObject的alloc函数时,应该是自动分配内存,是不是先存放信息的首地址?怎么知道要给这个子类分配多大的内存空间呢?

评分

参与人数 1技术分 +1 收起 理由
脸皮猴 + 1

查看全部评分

2 个回复

正序浏览
NSObject *object=[[NSObject alloc]init];

NSLog(@"%ld",sizeof(object));

这是我在网上找到的代码,应该可以计算出为子类开辟出的存储空间!
回复 使用道具 举报
这个是alloc的内部实现吧,文档上没有这个函数的实现,苹果官网上也没公开foundation框架的源码实现,我在网上找到了GNUstep的实现,听说它和cocoa的实现一致所以应该和苹果的foundation下的alloc实现应该是一致的,所以解释如下:
  1. struct obj_layout {
  2.     NSUInteger retained;
  3. };
  4. + (id) alloc
  5. {
  6.     int size = sizeof(struct obj_layout) + 对象大小;
  7.     struct obj_layout *p = (struct obj_layout *)calloc(1,size);
  8.     return (id)(p+1);
  9. }

复制代码

struct obj_layout 结构体中的retained保存了引用计数也就是头部信息,这个方法的实现的确是将信息存在首地址上这个信息是引用计数。至于给对象分配的内存大小它的内部又调用了NSZoneMalloc函数来分配内存实际的所需空间。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马