对象在内存中是如何存储的(内存五大区域和类加载)

  • Post author:
  • Post category:其他



/*

先了解下内存五大区域和类加载


1.


内存中的五大区域










局部变量,当局部变量的作用域,被执行完毕之后,这个局部变量就会被系统立即回收










程序猿手动申请的字节空间,


Malloc calloc



realloc


BBS





—-


未被初始化的全局变量和静态变量  一般初始化就回收,并转存到数据段中




数据段(常量区)


—-


已经被初始化的全局




静态变量




常量数据,知道程序结束的时候才会被回收




代码段


—-


存储代码,存储程序的代码





2.


类加载


a


。在创建的时候,肯定是需要访问类的


b


。声明一个类的指针变量也会访问类的




在程序运行期间,当某个类第一次被访问到的时候,会将这个类存储到内存中的代码段区域,这个过程,叫做类加载




只有类第一次被访问的时候,才会做类加载。一旦类被加载到代码以后,知道程序结束以后,才会被释放。




如图





内存当中,在内存中究竟是如何存储的




假设这个代码写在函数中


Person *p1 = [Person new];


a— Person *p1


会在栈的内存中申请一块空间,是


Person


类型的指针变量


p1.


所以这个


p1


是个指针变量,只能存储地址




如图


2




[Person new];


真正在内存中创建代码的是这一句


1.


在堆内存中申请合适的空间,在空间中,根据类的模板,创建对象。


2.


类模板中定义了什么属性,就把这些属性声明再这些对象之中




对象还有个属性叫做


isa


,是一个指针,指向对象属性的类,再代码中的地址。


3.


初始化对象的属性










如果属性的类型是基本数据类型,那么就是赋值


0





如果属性是


C


语言中的指针类型,那么就是


NULL





如果属性是


OC


语言中的,那么是


nil


4.


返回对象的地址






注意:对象中只有属性,没有方法,自己类的属性,外加一个


isa


指针,指向代码段中的类。





如何访问对象的属性:指针名字


->


属性名(根据指针,找到指针指向的对象,再找到对象中的属性来访问)





如何调用方法:




现根据指针的找到对象,对象发现要调用方法,在分局对象的


isa


指针找到类,然后调用类里面的方法




为什么不把方法存储在对象之中:因为一个对象的方法代码实现是一模一样,就没必要为每个对象保存一个方法,这样提浪费空间,所以只保留1分就行了

p1 p2 的isa 指针是相同的


*/


#import


<Foundation/Foundation.h>




@interface


Person :


NSObject


{




@public




NSString


*_name;




int


_age;


}


-(


void


)sayHI;


@end




@implementation


Person




-(


void


)sayHI


{




NSLog


(


@”


嘀嘀嘀,开车了





);


}




@end




int


main(


int


argc,


const




char


* argv[]) {




@autoreleasepool


{




Person


*p1 = [


Person




new


];







Person


*p2 = [


Person




new


];



p1->


_age


=


18


;




NSLog


(


@”p1==%p”


,p1);



[p1


sayHI


];






NSLog


(


@”Hello, World!”


);


}




return




0


;


}





版权声明:本文为qq_36747738原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。