3通过ARC管理内存

automatics references counting

堆 the heap

堆是指内存中的一块区域,应用中所有的对象都会保存在堆中

 

当应用向某个程序发送alloc消息时,系统会从堆中分配一块内存,其大小足够存放相应对象的全部实例变量。

以NSDate对象为例:该对象可以代表某个特定的时间点。该对象包含两个实例变量:

一个是double类型的变量(用于保存从某个固定时间点算起的时间差,单位为秒)。

另一个是继承自NSObject的isa指针(所有的对象都会继承)。

double变量8byte、指针变量4byte字节,因此NSDate类收到alloc信息时,系统会在堆上为新的NSDate对象分配一个大小为12个字节的内存空间。

一个对象永远不会直接保存另一个对象,所有的对象在堆中都是独立存在的,如果需要,一个对象可以保存指向其他对象的引用,可以将其他对象的地址赋值给指针实例变量。


栈是内存中的另一块区域,和堆是分开的。

堆:包含了大量无序的对象,需要通过指针来保存这些对象在堆中的地址。

栈:会按后进先出的规则保存一组帧(frame)

当程序执行某个方法或函数时,会从栈中分配一块内存空间,这块内存空间称为栈帧,栈帧负责保存程序在方法内声明的变量的值(局部变量local variable)


指针变量与对象所有权

指针变量暗含了对其指向的对象的所有权ownership

当某个方法(或函数)有一个指向某个对象的局部变量时,可以称该方法拥有该变量所指向的对象。

当某个对象拥有一个指向其他对象的实例变量时,可以称该对象拥有相应指针所指向的对象


内存管理

memory leak 如果某个对象没有拥有方,就应该将其释放掉。没有拥有方的对象是孤立的,程序无法向其发送消息。保留这样的对象只会浪费宝贵的内存空间,导致内存泄漏问题

过早释放:如果某个对象至少有一个拥有方,被释放的时候应用可能会在运行时出错,会发生崩溃。

哪些情况会使对象失去拥有方:

当程序修改某个指向特定对象的变量,将其指向另一个对象时。

当程序将某个指向特定对象的变量设置为nil时

当程序释放某个指向特定对象的变量时。

强引用和弱引用

弱引用适合解决一种称为retain循环的内存管理问题。

当两个或两个以上对象,相互之间有强引用特性的指针关联时,就会产生retain循环,retain cycle会导致内存泄漏。

 

posted @ 2015-09-10 17:12  captivity  阅读(79)  评论(0)    收藏  举报