大家中午好,xcode 中如何查看一个对象是在堆区还是在栈区?

大家中午好,xcode 中如何查看一个对象是在堆区还是在栈区?

阅读 6.9k
3 个回答

应该没法查看。
你初始化方法以 new, alloc, retain,copy 开头都是在堆区,也包括被引用计数管理的对象。
常量这些就会在栈区。

简单一点,除去 NSString *aString = @"aaa" 这种编译时会转换为常量

其它的 Objective-C 对象,理论上来说,都是在堆区.

此外,block 也是个例外,具体的可以去了解内存管理相关的知识点。

如何查看一个对象是在堆区还是在栈区
====================
你这个问题问的就比较模糊,如果是在方法执行过程当中,定义在本地的原生类型(或者说值类型)。那么肯定它是在栈上。当函数执行结束时直接销毁。而其它的引用类型(或者oc中的interface)都是在堆上创建的,由ARC负责清理。

我猜你想问的是 class Foo {

let a = 1

}
这个时候,a字段是在栈上还是堆上?如果是这个问题,那么告诉你a是在堆上,但它是个值类型。

值类型与在栈还是堆上分配内存无关,只和传值拷贝(隐含为不可变性)有关

一般情况下你可以打印出地址,判断他是在堆还是栈内存中,栈是高地址往下,堆是低地址往上,一般看到0x7fff....这种的肯定是是在栈中的,要注意一点的是TEXT段,像NSString这种基本放在TEXT段中,这种地址比堆地址更低,也很好区分;你可以去看一下内存是怎么划分的;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏