黑马程序员 05-OC对象的内存分析

———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———

首先,完整的代码如下:

 1 //1.类的声明
 2 #import <Foundation/Foundation.h>
 3 @interface Person : NSObject
 4 {
 5 @public
 6     int _age;//年龄
 7     double _weight;//体重
 8 }
 9 - (void)run;//跑
10 - (void)eat;//吃
11 @end
12
13
14 //2.类的实现
15 @implementation Person
16 //实现@interface中声明的方法
17 - (void)run
18 {
19     NSLog(@"%d岁,%.1fkg的在跑", _age, _weight);
20 }
21
22 - (void)eat
23 {
24     NSLog(@"%d岁,%.1fkg的人在吃", _age, _weight);
25 }
26
27 @end
28
29
30 int main(int argc, const char * argv[])
31 {
32
33     Person *person1 = [Person new];
34     person1 -> _age = 20;
35     person1 -> _weight = 50.0;
36     [person1 run];
37     [person1 eat];
38
39     Person *person2 = [Person new];
40     person2 -> _age = 30;
41     person2 -> _weight = 60.0;
42     [person2 run];
43     [person2 eat];
44 }

为了分析方便,我们把main函数的部分单独取出来,如下:

 1 int main(int argc, const char * argv[])
 2 {
 3
 4     Person *person1 = [Person new];
 5     person1 -> _age = 20;
 6     person1 -> _weight = 50.0;
 7     [person1 run];
 8     [person1 eat];
 9
10     Person *person2 = [Person new];
11     person2 -> _age = 30;
12     person2 -> _weight = 60.0;
13     [person2 run];
14     [person2 eat];
15 }

为了更好理解,画张图:

分析:

(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方法的代码。

  

时间: 2024-10-07 05:46:49

黑马程序员 05-OC对象的内存分析的相关文章

【黑马程序员】————进制、内存分析

一.      进制 1.书写格式: 二进制:0b或者0b开头 八进制:0开头 十六进制:0x或0X开头 2.printf以不同进制形式进行输出 3.  -0.089可以表示为-.089 ae-b   表示 a * 10^-b 二.      变量的内存分析 1.所占用字节数跟类型有关,也跟编译器环境有关 2.内存由大到小寻址 只存储二进制形式 每个变量都有地址:第一个字节的地址就是变量的地址 1>     查看内存地址的两种方式:%x和%p 2>     查看整数的二进制形式 // 输出整数

【黑马程序员】————OC特有语法

一.点语法 点语法的本质还是方法调用 p.age = 10; // [p setAge:10]; int a = p.age; // [p age]; 二.成员变量的作用域 @public : 在任何地方都能直接访问对象的成员变量 @private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private) @protected : 可以在当前类及其子类的对象方法中直接访问 (@interface中默认就是@protected) @package : 只要处在

【好程序员笔记分享】——动态内存分析

ios培训------我的c语言笔记,期待与您交流! 再C语言中关于内存是一个很重要的知识点,所以今天我就从c语言的内存分配开始为大家解析一下C语言再iOS开发中非常重要的一些知识. 1:malloc函数的介绍 C语言中开辟内存空间:malloc函数 再C语言中malloc原理大致是这样的: malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表.调用malloc函数时,它沿连接表寻找一个大到足以满足用 户请求所需要的内存块.然后,将该内存块一分为二(一块的大小与

ios开发:OC对象的内存分析

最近要开始准备找实习单位了,做做笔试题,看看各位大神的面试经历,发现自己要学习的东西真的还有很多,虽然也做过几个的项目,但是真正拿过笔试题一看,才发现自己对基础这方面的东西,确实有点忽视了,所以最近开启恶补模式. 这几天在研究ios内存分析这一块,才发现自己原来忽视了这么多重要的东西,在这里和大家分享一下. 先来看一段代码: NSString* s;s = [[NSString alloc] initWithString:@"hello ios"]; 这是一段最简单的字符串定义,但是看

【黑马程序员】OC基本语法——类与对象相关概念

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 最近在学OC的面向对象部分,可能是因为以前学Java和PHP时习惯了主流的面向对象思想,接触到OC的面向对象有很多说法都不习惯,查了很多东西,终于基本都搞清楚了,在这里小结一下. 一.类和对象 1.类:类是一个抽象概念,代表着一类事物,如:人,动物,交通工具等:这个和Java或PHP里类的概念没有区别. 其定义方法如下: @interface Student : NSObject { NSSt

黑马程序员_类对象创建代码的执行顺序测试总结

class StaticCode { // 类的非静态成员变量(实例变量)定义语句: // 作用:用来存储对象的特有数据的成员变量. // 运行:当类对象被创建时就执行,按照顺序自上而下执行,和构造代码块平级.(即当有多个构造函数 // 代码块和多个非静态成员变量时,JVM按照自上而下的顺序来执行所有语句,包括构造代码块里的代码 // 和非静态成员的声明.) // 存储位置:非静态变量位于堆内存中的对象实体中. int num = 3; // 构造代码块 { System.out.println

《黑马程序员》 OC的三大特性

OC 的三大特性:封装.继承.多态. 封装:过滤不合理的值 #import <Foundation/Foundation.h> // set 方法 // 作用:提供一个方法给外界设置成员变量,可以在方法对成员变量进行赋值和过滤 // get 方法 // 作用:返回对象内部的成员变量,得到成员变量的值. @interface Student : NSObject { // 成员变量名的命名规范 // 成员变量名肯定以下划线开头 // 好处:可以区分参数名称和成员变量的名称,也可以区分变量名和成员

黑马程序员-OC-面向对象

------- IOS培训.android培训.java培训.期待与您交流! ---------- 面向对象和面向过程的区别 面向过程关心的是解决问题需要哪些步骤. 面向对象关注的是解决问题需要哪些对象. oc中的面相对象 世界万物皆对象. 面向对象更加复合人民的思考习惯,将复杂的事情简单化处理,使人民从执行者变成了指挥者 oc中的类相当于图纸,用来描述一类事物.也就是说,要想创建对象,必须先有类 oc利用类来创建对象,对象是类的具体存在 因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用

黑马程序员 01-面向对象思想和面向过程思想

———Java培训.Android培训.iOS培训..Net培训.期待与您交流! ——— OC是面向对象的,C是面向过程的.二者只是解决问题的两种不同的思想. 1.面向对象和面向过程的区别 (1)以用电脑看电影为例 <1>面向过程思想(关注的是具体的步骤) 这里我们是执行者,我们需要关注具体每个步骤怎么来实现. 1)开电脑(步骤1) 2)播放电影(步骤2) 3)关闭电脑(步骤3) <2>面向对象思想(关注的是对象) 这里我们是指挥者,具体行为由电脑来执行,我们不必关注具体是怎么执行

黑马程序员 02-类与对象的关系

———Java培训.Android培训.iOS培训..Net培训.期待与您交流! ——— 1.如何创建对象 1)面向对象解决问题的时候必须有对象,那么如何创建对象呢? 2)现实生活的例子:如何创建汽车对象? a)首先需要有汽车的图纸,图纸上描述汽车应该具备的属性和功能(行为) 属性:轮子个数.时速 功能(行为):跑 b)然后根据图纸上的描述创建汽车 c)每一辆车都具有自己的属性和功能,都是图纸的实例 d)图纸是抽象的,汽车是具体的:图纸是对汽车对象的高度概括 2.OC中的面向对象 1)OC中的类