大家中午好,xcode 中如何查看一个对象是在堆区还是在栈区?
业精于勤,荒于嬉;行成于思,毁于随。
应该没法查看。你初始化方法以 new, alloc, retain,copy 开头都是在堆区,也包括被引用计数管理的对象。常量这些就会在栈区。
简单一点,除去 NSString *aString = @"aaa" 这种编译时会转换为常量
编译时会转换为常量
其它的 Objective-C 对象,理论上来说,都是在堆区.
此外,block 也是个例外,具体的可以去了解内存管理相关的知识点。
如何查看一个对象是在堆区还是在栈区====================你这个问题问的就比较模糊,如果是在方法执行过程当中,定义在本地的原生类型(或者说值类型)。那么肯定它是在栈上。当函数执行结束时直接销毁。而其它的引用类型(或者oc中的interface)都是在堆上创建的,由ARC负责清理。
我猜你想问的是 class Foo {
let a = 1
}这个时候,a字段是在栈上还是堆上?如果是这个问题,那么告诉你a是在堆上,但它是个值类型。
值类型与在栈还是堆上分配内存无关,只和传值拷贝(隐含为不可变性)有关
一般情况下你可以打印出地址,判断他是在堆还是栈内存中,栈是高地址往下,堆是低地址往上,一般看到0x7fff....这种的肯定是是在栈中的,要注意一点的是TEXT段,像NSString这种基本放在TEXT段中,这种地址比堆地址更低,也很好区分;你可以去看一下内存是怎么划分的;
应该没法查看。
你初始化方法以 new, alloc, retain,copy 开头都是在堆区,也包括被引用计数管理的对象。
常量这些就会在栈区。
简单一点,除去 NSString *aString = @"aaa" 这种
编译时会转换为常量
其它的 Objective-C 对象,理论上来说,都是在堆区.
此外,block 也是个例外,具体的可以去了解内存管理相关的知识点。
如何查看一个对象是在堆区还是在栈区
====================
你这个问题问的就比较模糊,如果是在方法执行过程当中,定义在本地的原生类型(或者说值类型)。那么肯定它是在栈上。当函数执行结束时直接销毁。而其它的引用类型(或者oc中的interface)都是在堆上创建的,由ARC负责清理。
我猜你想问的是 class Foo {
}
这个时候,a字段是在栈上还是堆上?如果是这个问题,那么告诉你a是在堆上,但它是个值类型。
值类型与在栈还是堆上分配内存无关,只和传值拷贝(隐含为不可变性)有关
一般情况下你可以打印出地址,判断他是在堆还是栈内存中,栈是高地址往下,堆是低地址往上,一般看到0x7fff....这种的肯定是是在栈中的,要注意一点的是TEXT段,像NSString这种基本放在TEXT段中,这种地址比堆地址更低,也很好区分;你可以去看一下内存是怎么划分的;