对象的简单内存分析

在如今学习的过程中,我们更多的是在练习如何使用各种方法或某种套路,例如需要设计某个app的时候,我们可能会说我们之前设计过的模型中直接套过来使用,或者在网上需找类似的demo,随着时间和经验的积累,我们在这一方面越来越得心应手,以后一直是copy、copy等,但对一些简单的本质东西不甚了解了,虽然这些东西也可以不必去知道,但我认为多了解一些基本的东西还是有好处的,下面就来简单的说一些对象的内存的问题:
1.我们先来创建一个Person类:
#import <Foundation/Foundation.h>

@interface DCPerson : NSObject
{
    int       age;
    NSString  *name;
}
-(void)eat;
-(void)walk;
@end

代码很简单,就没有写注释了。首先是创建一个DCPerson类,这个类有两个属性,age和name。同时有两个方法,分别是-(void)eat和

-(void)walk。

当我们在程序中创建一个类的时候,在内存中会给类分配内存,首先类肯定是有地址的,其次类中会有对应的方法。

当我们使用类创建对象的时候,会相应的给对象分配存储空间。例如我们创建两个对象person1和person2。

- (void)viewDidLoad {
    [super viewDidLoad];

    //创建person1对象
    DCPerson *person1=[[DCPerson alloc] init];

    [person1 age];

    [person1 walk];

    self.person1=person1;

    //创建person2对象
    DCPerson *person2=[[DCPerson alloc] init];

    [person2 age];
    [person2 walk];

    self.person2=person2;

}

这样,内存中就会多出两块区域,用来存放person1对象和person2对象。

下面先上图,结合图片来分析大概的情况。

当我们使用类创建一个对象的时候,每个对象就会有一个isa指针,当我们给对象发送消息的时候,对象会通过自身的isa指针去类中找对应的方法,从来来实现方法。属性是每个对象特有的,而方法是所有对象共有的,只有一份。类在内存中只会被加载一次。

以上是一些自己对对象内存的简单分析,只是做了一些很简单的分析,有不对的地方还望大神指正,谢谢!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 17:14:37

对象的简单内存分析的相关文章

Java程序开发中的简单内存分析

首先说明内存总体分为了4个部分, 包括 1.stack segment (栈区存储基本数据类型的局部变量,对象的引用名) 2.heap segment(堆区,一般用于存储java中new 出来的对象) 3.code segment (代码段) 4.data segment (数据段,静态数据常量) 其中我们程序中用关键字new出来的东西都是存放在heap segment: 程序中的局部变量存放在stack segment,这些局部变量是在具体方法执行结束之后,系统自动释放内存资源(而heap s

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

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

Java面向对象_对象内存分析—值传递和引用传递

对象内存分析,我一直学的比较模糊,今天抽空整理一下,希望能理清. 先说一下,内存分析从何而来,这对于我们这些刚接触java的人来说都比较模糊,就从new关键字说起吧. new关键字表示创建一个对象或者说是实例化对象或者说是申请内存空间,所有程序运行都需要内存来存储数据,这样内存的概念就出来了.举个例子说明:定义一个类Person,属性:char a;int sge;那么创建一个对象申请的内存空间就是所有属性所占字节之和,为6个字节. 详细理一下对象在内存中的结构: Person p=new Pe

Java之内存分析和String对象

http://www.cnblogs.com/devinzhang/archive/2012/01/25/2329463.html Java中内存分析: 栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中). 堆(heap):存放所有new出来的对象. 常量池(constant pool):在堆中分配出来的一块存储区域,存放储显式的String常量和基本类型常量(float.int等).另外

new Java对象占用内存分析

最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好:http://yueyemaitian.iteye.com/blog/2033046,里面提供的这个类也非常实用: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

『Python』内存分析_List对象内存占用分析

『Python』内存分析_下_list和array的内存增长模式 list声明后结构大体分为3部分,变量名称--list对象(结构性数据+指针数组)--list内容,其中id表示的是list对象的位置, v引用变量名称,v[:]引用list对象,此规则对python其他序列结构也成立,以下示范可用id佐证, a=b时,a和b指向同一个list对象 a=b[:]时,a的list对象和b的list对象指向同一个list内容 Q1:元素存储地址是否连续 首先见得的测试一下list对象存储的内容(结构3

六、对象和内存分析

面向过程思想:         面向过程通过过程组成编程,遇到事情,第一步,第二步....,不需要协作,适合小规模的程序,比如开车. 面向对象思维       面向对象通过对象组成编程,比如造车,第一步,第二步....,无法确定,需要大规模的协作,有设计者的思维,拆分成一个个个体,造轮胎的厂家.发动机的厂家.车壳.座椅 .挡风玻璃等等.当然,分成这些块以后,就是一个个的过程去实现. 综上:遇到复杂问题,用面向对象思考,找名词,确定各个名词的关系:面向过程思考,找动词,在面向对象设计好了以后,底层

方法与对象内存分析

---方法区内存:在类加载的时候,class字节码代码段被加载到该内存空间中---栈内存(局部变量):方法代码段片段执行的时候,会给该方法分配内存空间,在栈内存中压栈,执行完毕之后释放内存空间,做弹栈操作.---堆内存(实例变量):new的对象在堆内存中存储.方法内存分析 public class Hello { public static void main(String[] args) { int a = 100; int b = 200; int res = sum(a, b); Syst

JS内存泄漏 和Chrome 内存分析工具简介(摘)

原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱 原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - ARIGATO 链接:http://web.jobbole.com/88463/ 点击 → 了解如何加入专栏作者 了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读