我一直在Cocoa应用程序0x618....中看到这些地址
据我所知,对象在堆栈或堆上分配。
在应用程序执行时,生成堆栈帧并将其放置在堆栈上,在堆栈范围内创建的任何本地指针都在堆栈(0x7FFF...)上分配。
并且指针所引用的实际底层对象在堆(0x0000010...)上创建。
但实际上,内存中的这个0x618....区域也用作对象的堆吗?因为如果取消引用堆栈中指向NSObject子类的指针,我看到它几乎总是指向0x618...。
可可应用程序有两个堆吗?
或者0x618...是应用程序的实际堆,而0x000001只是其他内存的一部分,完全用于其他方面?
发布于 2017-07-06 03:53:19
堆通常位于堆栈下面和代码之上。因此,不可能确定堆地址的起始位置,但是对于堆地址来说,0x618...并不是不合理的。
不是所有的对象都在堆中,例如,字符串常量被编译到您的代码中,并且您的0x000001...可以很容易地成为一个对象。
还有标记指针的复杂性。有些对象甚至没有分配堆,但是它们的值与一些标记位组合成一个标记指针,这个指针根本不是指针,而是在指针类型的变量中找到的。对于某些值,NSNumber是这样的,例如,@42返回“指针”0x2a37。
HTH
https://stackoverflow.com/questions/44936910
复制相似问题