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