Cocoa应用程序中有哪些不同类型的内存地址?

A O*_*A O 4 cocoa objective-c memory-address

每当我在我的Cocoa应用程序中查看内存地址时,我会注意到(通常)3个主要类别的地址

  • 0x00006xxxxxxx
  • 0x00007fffxxxx
  • 0x0000001xxxxx

我知道什么是什么 - 就像我注意到0x00006xxxxxxx地址似乎是我应用程序对象的指针

并且0x0000001xxxxx似乎是内存中实际对象的地址?

但我真的不确定任何事情,我无法形成一个好的谷歌查询给我一个答案.

有没有人有资源,或者知道如何识别Cocoa应用程序中的地址类别?

Cal*_*leb 7

有没有人有资源,或者知道如何识别Cocoa应用程序中的地址类别?

地址本身不属于类别 - 地址是地址.但确实存在用于不同事物的不同内存区域,尤其是堆栈和堆.在包含MacOS的许多系统上,堆从相对较低的地址开始并向上增长(地址增加),而堆栈从高地址开始并向下增长.

Objective-C对象总是在堆上分配并通过指针访问,因此有意义的是对象本身的地址具有低地址,而指向对象的指针(通常是存储在堆栈中的全局变量或局部变量)具有高地址.全局变量存在于堆栈的基础上,因此它们将具有比局部变量更高的地址(同样,堆栈向下增长).

尽管如此,不要假设地址表示存储在该位置的物品的类型.虽然通常你不会在堆栈上找到Objective-C对象,但你肯定会在堆中的地址处找到大量的对象指针,因为对象包含指向其他对象的指针.还有,可能会发现其它类型的数据的块:原始数据类型(int,char等),C语言风格的阵列,数据缓冲器,块等

我可能会遗漏一些其他区域,例如代码段的空间,但这是一般的想法.了解内存的组织方式通常很有帮助,但与此同时,除非您编写需要它的软件(例如调试器),否则应避免编写依赖于该知识的代码.

如果你想了解更多,你可以从Mike Ash的几篇博客文章开始: