黑马程序员技术交流社区

标题: 日课22 OC类和对象的内存分析 [打印本页]

作者: 黑白世界    时间: 2015-10-9 13:51
标题: 日课22 OC类和对象的内存分析
一、通过 Person *per1 = [Person new]; 实例化对象时,系统做了一下三件事:
1.向系统申请内存空间(申请的是堆空间,用来存放对象属性(也就是实例变量)和_isa指针。)
2.给实例变量初始化(初始化原则:基本数据类型的都初始化为 0 ;NSString的都初始化为 null)
3.[Person new]将返回一个空间的首地址(这个首地址是堆空间的首地址)给指针 per1
二、内存图分析

1.在代码区加载类的代码,包括类名,属性,方法。注意,一个类,无论实例化多少次,都只加载一次。
2.在堆区中申请一块空间,用来存放_isa指针和实例变量。_isa指针存放了代码区的地址。
3.存放在堆区的实例变量初始化:基础数据类型的初始化为 0,NSString初始化为 null.
4.栈中存放对象实例per1,它是执行堆的首地址的指针。
三、问答题
1.申请的空间在内存的什么空间?
答:new 的时候申请的是堆空间。(内存分析图见后边)
2.实例变量保存在什么地方?
答:堆空间。对象指针(per1)存在栈区。
3.对象方法保存在什么地方?
答:代码区
4.通过 [per1 run]; 的方式调用函数方法 原理是什么?
答:栈区的per1指针可以找到堆区的_isa指针,_isa指针指向该类的代码区,而类的方法存储在代码区。
5.一个类可以实现多个对象,以下班代码为例,并配有内存图例:
  1. //类的声明
  2. @interface Person: NSObject
  3. {     @public;
  4.         int age;
  5.         NSString *name;   
  6. }
  7. -(void) run;
  8. @end

  9. //类的实现
  10. @implementation Person
  11. -(void) run{
  12.     NSLog(@"this man is running");
  13. }
  14. @end

  15. //类的实例化
  16. Person *per1 = [Person new];
  17. Person *per2 = [Person new];

  18. //更改实例变量的值
  19. per1->name = @"小明";
  20. per1->age = 15;
  21. per2->name = @"小红";
  22. per2->age = 13;
  23. //调用类的方法
  24. [per1 run];
  25. [per2 run];
复制代码



一个对象内存图.jpg (112.83 KB, 下载次数: 4)

一个对象内存分析图

一个对象内存分析图

2.png (129.85 KB, 下载次数: 1)

一个类实现两个对象的内存分析图

一个类实现两个对象的内存分析图

作者: wowcjmwd    时间: 2015-10-10 20:23
顶顶顶 ,谢谢分享




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