一、通过 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.一个类可以实现多个对象,以下班代码为例,并配有内存图例:
- //类的声明
- @interface Person: NSObject
- { @public;
- int age;
- NSString *name;
- }
- -(void) run;
- @end
- //类的实现
- @implementation Person
- -(void) run{
- NSLog(@"this man is running");
- }
- @end
- //类的实例化
- Person *per1 = [Person new];
- Person *per2 = [Person new];
- //更改实例变量的值
- per1->name = @"小明";
- per1->age = 15;
- per2->name = @"小红";
- per2->age = 13;
- //调用类的方法
- [per1 run];
- [per2 run];
复制代码
|
-
一个对象内存图.jpg
(112.83 KB, 下载次数: 6)
一个对象内存分析图
-
2.png
(129.85 KB, 下载次数: 2)
一个类实现两个对象的内存分析图
|