1. Objective-C语言(二)内存模型

Objective-C 语言中的指针是用来指示对象的。想要声明一个变量,让其指向一个对象,可以用如下的写法

NSString *someString = @"The string";

这种写法基本上是照搬C语言的,它声明了一个名为 someString 的变量,其类型是 NSString*。也就是说,此变量为指向 NSString 的指针。

对象所占内存总是分配在 “堆空间”(heap space)中, 绝不会分配在 “栈”(stack)上。不能在栈中分配 Objective-C 对象。

someString 变量指向分配在堆空间里面的某一块内存,其中包含一个 NSString 对象。也就是说,如果再创建一个变量,让其指向同一地址。那么并不拷贝该对象,只是这两个变量会同时指向此对象。

NSString *someString = @"The string";
NSString *anotherString = someString;

只有一个 NSString 实例,有两个变量指向这一个实例。两个变量都是 NSString*类型,这说明当前 “栈帧” 里分配了两块内存,每一块内存的大小都能容下一枚指针。这两块内存里的值都一样,就是 NSString 实例的内存地址。

下图描述了此时的内存布局。存放在 NSString 实例中的数据含有代表字符串实际内容的字节。(思考1)

此图演示了一个分配在堆中的 NSString 实例,有两个分配在栈中的指针指向该实例

分配在堆中的内存必须直接管理,而分配在栈上用于保存变量的内存则会在其栈帧弹出时自动清理。(思考2)

Objective-C 将堆内存管理抽象出来了。不需要像C语言那样,用 malloc 及 free 来分配或释放对象所占内存。Objective-C 运行期环境把这部分工作抽象为一套内存管理架构,名叫“引用计数”

思考1:如果是可变的 NSMutableString,那么内存的分配又会是怎样?

思考2:什么是栈帧的弹出,怎么被自动清理的?

你可能感兴趣的:(1. Objective-C语言(二)内存模型)