05-OC对象的内存分析
2014-09-27 12:50
295 查看
首先,完整的代码如下:
为了分析方便,我们把main函数的部分单独取出来,如下:
为了更好理解,画张图:
分析:
(1)执行第4行代码的时候,实际上包含了3步操作:
1>在内存中开辟空间:为新创建的Person类对象1,开辟一块存储空间,如图;
2>初始化成员变量:默认初始化为0
3>返回空间地址:创建一个指针变量person1,并将对象1的地址赋值给person1,所以person1 = ffc0,如图。
(2)同(1)第10行代码执行完毕后:在内存中开辟了另一块空间,存放新建的Person类对象2,并把对象2的地址赋值给指针变量person2,这时person2 = ffc1,如图。
(3)在使用类创建对象之前,会将类加载进内存(只会加载1次),并且类中声明的方法列表都保存在类中。
(4)每个对象内部,默认有一个isa指针,isa指针指向的就是当前对象所对应的类。
(5)成员变量是每个对象都有的,方法列表只有1份,是所有对象共同使用的。
(6)成员变量赋值:当执行person1 -> _age = 20;的时候,person1会访问它所指向的对象,并将20赋值给_age;
(7)调用方法的本质:当执行[person1 run]的时候,会给person1所指向的对象发送一条run消息,这时对象1会通过isa指针找到类,在类中的方法列表中找到run方法并调用,一调用run方法,就会来到run方法所对应的代码区,执行run方法的代码。
//1.类的声明 #import <Foundation/Foundation.h> @interface Person : NSObject { @public int _age;//年龄 double _weight;//体重 } - (void)run;//跑 - (void)eat;//吃 @end //2.类的实现 @implementation Person //实现@interface中声明的方法 - (void)run { NSLog(@"%d岁,%.1fkg的在跑", _age, _weight); } - (void)eat { NSLog(@"%d岁,%.1fkg的人在吃", _age, _weight); } @end int main(int argc, const char * argv[]) { Person *person1 = [Person new]; person1 -> _age = 20; person1 -> _weight = 50.0; [person1 run]; [person1 eat]; Person *person2 = [Person new]; person2 -> _age = 30; person2 -> _weight = 60.0; [person2 run]; [person2 eat]; }
为了分析方便,我们把main函数的部分单独取出来,如下:
int main(int argc, const char * argv[]) { Person *person1 = [Person new]; person1 -> _age = 20; person1 -> _weight = 50.0; [person1 run]; [person1 eat]; Person *person2 = [Person new]; person2 -> _age = 30; person2 -> _weight = 60.0; [person2 run]; [person2 eat]; }
为了更好理解,画张图:
分析:
(1)执行第4行代码的时候,实际上包含了3步操作:
1>在内存中开辟空间:为新创建的Person类对象1,开辟一块存储空间,如图;
2>初始化成员变量:默认初始化为0
3>返回空间地址:创建一个指针变量person1,并将对象1的地址赋值给person1,所以person1 = ffc0,如图。
(2)同(1)第10行代码执行完毕后:在内存中开辟了另一块空间,存放新建的Person类对象2,并把对象2的地址赋值给指针变量person2,这时person2 = ffc1,如图。
(3)在使用类创建对象之前,会将类加载进内存(只会加载1次),并且类中声明的方法列表都保存在类中。
(4)每个对象内部,默认有一个isa指针,isa指针指向的就是当前对象所对应的类。
(5)成员变量是每个对象都有的,方法列表只有1份,是所有对象共同使用的。
(6)成员变量赋值:当执行person1 -> _age = 20;的时候,person1会访问它所指向的对象,并将20赋值给_age;
(7)调用方法的本质:当执行[person1 run]的时候,会给person1所指向的对象发送一条run消息,这时对象1会通过isa指针找到类,在类中的方法列表中找到run方法并调用,一调用run方法,就会来到run方法所对应的代码区,执行run方法的代码。
相关文章推荐
- 第02天OC语言(05):对象作为方法参数分析
- (转)c++对象内存分析4
- Java内存对象的逃逸分析
- Java之内存分析和String对象
- C++类对象内存模型与成员函数调用分析(上)
- C++对象内存分析
- (转)c++对象内存分析3
- 韩顺平_轻松搞定网页设计(html+css+javascript)_第30讲_类和对象细节_创建对象的几种方式_js对象内存分析_学习笔记_源代码图解_PPT文档整理
- 第30讲 类和对象细节 创建对象的几种方式 js对象内存分析
- (转)c++对象内存分析5
- c++内存中的对象布局分析
- C++类对象内存模型与成员函数调用分析(上)
- C++类对象内存模型与成员函数调用分析(下)
- C++类对象内存模型与成员函数调用分析(中)
- Java内存对象的逃逸分析
- (转)c++对象内存分析5
- C++类对象内存模型与成员函数调用分析(上)
- C++类对象内存模型与成员函数调用分析
- [cpp] C++对象内存布局分析
- java对象内存占用情况分析