美文网首页
回答一个问题:xcode 中如何查看一个对象是在堆区还是在栈区?

回答一个问题:xcode 中如何查看一个对象是在堆区还是在栈区?

作者: fuadam1982 | 来源:发表于2016-12-07 17:33 被阅读663次

** 如何查看一个对象是在堆区还是在栈区 **

这个问题问的就比较模糊,如果是在函数执行过程当中,那么定义在本地的原生类型(或者说值类型),肯定是在栈上分配。当函数执行结束时会被直接销毁。而其它的引用类型(或者oc中的interface)都是在堆上创建的,由ARC负责清理。例如:

func boo() -> Any {
    // a、b都是值类型,在栈上分配,boo执行结束后销毁
    let a = 3
    let b = 5
    // my1是值类型,在栈上分配,boo执行结束后销毁
    let my1 = MyStruct(val: a+b)
    // my2是引用类型,在堆上分配,my1被拷贝一份内存副本传递到MyClass.init中
    let my2 = MyClass(val: my1)
    // my2因为离开了函数调用栈,所以被ARC标记为autorelease,如果用oc的MRC写法是[my2 autorelease]。它的内存释放依赖于外层(或者系统)的autoreleasepool调用
    return my2
}

我猜他实际想问的是这个

class Foo {
    let a = 1
}

这个时候,a字段是在栈上还是堆上?如果是这个问题,那么答案是a分配在堆上(属于Foo实例内存的一部分),虽然它是个值类型(Int)。

** 因为值类型与在栈上还是堆上分配内存关系不大,而和传值拷贝(隐含为不可变性)关系交大 **

相关文章

  • 回答一个问题:xcode 中如何查看一个对象是在堆区还是在栈区?

    ** 如何查看一个对象是在堆区还是在栈区 ** 这个问题问的就比较模糊,如果是在函数执行过程当中,那么定义在本地的...

  • 2019-07-08 Java面试题

    方法通常存储在进程中的哪一区()A.堆区B.栈区C.全局区D.方法区 解析:一条进程的栈区,堆区,方法区,代码区在...

  • iOS:内存五大区

    前言: 在iOS开发中,平常大家都会说,堆区,栈区,都是存在虚拟内存。 虚拟内存五大区:堆区、栈区、全局区、常量区...

  • iOS底层原理:内存五大区

    在iOS中,内存主要分为栈区、堆区、全局区、常量区、代码区五大区域。如下图所示 栈区(Stack) 定义 栈是系统...

  • 堆与栈 堆区和栈区的区别

    一、 栈和堆事数据结构中的叫法,栈区和堆区是进程的内存模型中的堆区和栈区 二 内存模型里堆区和栈区和数据结构没有关...

  • 线性表和队列

    首先,讨论的堆和栈指的是内存中的“堆区”和“栈区”。C语言的内存模型分为5个区:栈区、堆区、静态区、常量区、代码区...

  • NSTaggedPointerString,__NSCFCons

    问题引入: NSString都存储在堆区吗?会不会存在栈区,或者数据区呢? NSString用copy修饰还是st...

  • 栈/堆/全局区/常量区/代码区

    来源:iOS程序中的内存分配 栈区堆区全局区 - 简书 栈:存储局部变量 堆:允许程序员手动在堆区申请指定的连续的...

  • 2018-09-29

    在C/C++中,内存一般分为:堆区,栈区,全局区,文字长量区,程序代码区。 在函数中定义的局部变量是存在在栈区(除...

  • 堆 / 栈 / 自由存储区 / 静态存储区 / 常量存储区

    在C++中, 内存分成5个区,分别是堆,栈,自由存储区,静态存储区,常量存储区。 栈:编译器在需要的时候分配,在不...

网友评论

      本文标题:回答一个问题:xcode 中如何查看一个对象是在堆区还是在栈区?

      本文链接:https://www.haomeiwen.com/subject/arxjmttx.html