黑马程序员-------OC----对象存储

来源:互联网 发布:java计算器程序源代码 编辑:程序博客网 时间:2024/06/14 15:53

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


在OC中,当我们通过实例化一个类的对象时,该对象在内存中的存储细节为:

这里写图片描述

可以看到,对象首地址保存在栈区的变量p中,在堆区分配的对象空间中,有一个隐藏的_isa指针,指向了内存代码区的对象所属的类。

每个实例对象都有一个isa指针,这个指针指向当前对象所属的类
[p run]表示给p所指向的对象发送一条run消息,调用对象的run方法,此时对象会顺着内部的isa指针找到存 储于类中的方法,执行
通过isa指针我们可以在运行的时候知道当前对象是属于哪个Class(类)的
类对象存储类的成员变量和方法声明

再看一段代码:

NSString* s;s = [[NSString alloc] initWithString:@"hello world"];

这是一段最简单的字符串定义,但是看似简单,其实有很多东西可能会被忽略掉
这里的s其实是个指针,在oc中除了基本数据类型之外的变量类型都是指针类型,oc的对象也是通过指针进行操作的。
在第一段代码定义了NSString类型的指针变量,但是并没有指向任何对象,第二段代码alloc一个NSString对象 然后使s指向它,并通过s开始其的后续操作。
这里s的内存空间在栈内存中,“hello world”在堆内存中。

可以看出,oc中创建的对象指针存储在栈内存中,而alloc出来的对象的内存在堆内存中,栈内存中的指针通过赋值指向堆内存中的对象,然后通过栈内存中的指针访问对象及其变量,也就是说,其实我们在创建一个对象时其实是利用了两个部分的内存空间。

0 0
原创粉丝点击