搜索

首页  >  问答  >  正文

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

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

迷茫迷茫2771 天前893

全部回复(3)我来回复

  • 黄舟

    黄舟2017-04-18 09:49:36

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

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

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

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

    回复
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:49:36

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

    我猜你想问的是 class Foo {

    let a = 1

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

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

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-18 09:49:36

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

    回复
    0
  • 取消回复