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会导致内存泄漏。

浙公网安备 33010602011771号