相关概念
- 栈
- 当程序执行某个方法(或函数)时,会从内存中名为栈(stack)的区域分配一块内存空间,这块内存空间称为帧(frame)。帧负责保存程序在方法内声明的变量的值。在方法内声明的变量称为局部变量(local variable)。
- 当某个应用启动并运行main函数时,它的帧会被保存在栈的底部。当main调用另一个方法(或函数)时,这个方法的帧会压入栈的顶部。被调用的方法还可以再调用其它方法,以此类推,最终会在栈中形成一个塔状的帧序列。当被调用的方法结束时,程序会将其帧从栈顶“弹出”并释放。如果同一个方法再次被调用,则应用会创建一个全新的帧,并将其压入栈的顶部。
- 堆
- 堆(heap)是指内存中的另一块区域,和栈是分开的。为这两类内存区域分别取名堆和栈,是为了能够形象地描述这两个概念。栈会按后进先出的规则保存一组帧,而堆则包含了大量无序的活动对象,需要通过指针来保存这些对象在堆中的地址。
- 对象所有权
- 指针变量暗含了对其所指向的对象的所有权(ownership)。当某个方法有一个指向某个对象的局部变量时,可以称该变量拥有(own)该变量所指向的对象。当某个对象有一个指向其它对象的实例对象时,可以称该对象拥有该实例变量所指向的对象。
- 如果对象没有拥有者,就应该将其释放掉。没有拥有者的对象是孤立的,程序无法向其发送消息。保留这样的对象只会浪费宝贵的内存空间,导致内存泄露(memory leak)
- 如果某个对象有一个或多个拥有者,就必须保留不能释放。如果释放了某个对象,但是其他对象或方法中仍然有指向该对象的指针(准确地说,是指向该对象被释放前的地址),那么向该指针指向的对象发送消息就会使应用崩溃。释放正在使用的对象的错误称为过早释放。指向不存在的对象的指针称为空指针(dangling pointer)或者空引用(dangling reference)。
- 哪些情况会使对象失去拥有者
- 当程序修改某个指向特点对象的变量并将其指向另一个对象时。
- 当程序将某个指向特点对象的变量设置为nil时。
- 当程序释放对象的某个拥有者时。
- 当从collection类中(例如数组)删除对象时。
posted on
2015-12-11 23:24
夏鲁鲁
阅读(
148)
评论()
编辑
收藏
举报