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

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

这个问题问的就比较模糊,如果是在函数执行过程当中,那么定义在本地的原生类型(或者说值类型),肯定是在栈上分配。当函数执行结束时会被直接销毁。而其它的引用类型(或者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)。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,495评论 11 349
  • 喜欢的话记得点赞 一、内存管理:移动设备的内存及其有限,每一个APP所能占用的内存是有限制的二、什么行为会增加AP...
    甘哲157阅读 6,133评论 1 12
  • 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就...
    木有鱼丸啦阅读 3,616评论 0 0
  • 细雨骤歇,山路淋漓,群山雾绕,赏东山美景,何乎快哉。 登封及巅,仰望苍天,连峰似棋,径如盘龙,似想扶摇入云霄。 观...
    無争阅读 4,332评论 3 1
  • (第一季 第二十二集) 《遇上变异者》 我们正在行进的路上,突然,一阵嘶吼声传了出来,我警觉的停下车,拿出我的专...
    叶落飞雪阅读 1,009评论 0 0

友情链接更多精彩内容